Chris@909: module CodeRay
Chris@909:
Chris@909: # = WordList
Chris@909: #
Chris@909: # A Hash subclass designed for mapping word lists to token types.
Chris@909: #
Chris@909: # Copyright (c) 2006-2011 by murphy (Kornelius Kalnbach)
Chris@909: #
Chris@909: # License:: LGPL / ask the author
Chris@909: # Version:: 2.0 (2011-05-08)
Chris@909: #
Chris@909: # A WordList is a Hash with some additional features.
Chris@909: # It is intended to be used for keyword recognition.
Chris@909: #
Chris@909: # WordList is optimized to be used in Scanners,
Chris@909: # typically to decide whether a given ident is a special token.
Chris@909: #
Chris@909: # For case insensitive words use WordList::CaseIgnoring.
Chris@909: #
Chris@909: # Example:
Chris@909: #
Chris@909: # # define word arrays
Chris@909: # RESERVED_WORDS = %w[
Chris@909: # asm break case continue default do else
Chris@909: # ]
Chris@909: #
Chris@909: # PREDEFINED_TYPES = %w[
Chris@909: # int long short char void
Chris@909: # ]
Chris@909: #
Chris@909: # # make a WordList
Chris@909: # IDENT_KIND = WordList.new(:ident).
Chris@909: # add(RESERVED_WORDS, :reserved).
Chris@909: # add(PREDEFINED_TYPES, :predefined_type)
Chris@909: #
Chris@909: # ...
Chris@909: #
Chris@909: # def scan_tokens tokens, options
Chris@909: # ...
Chris@909: #
Chris@909: # elsif scan(/[A-Za-z_][A-Za-z_0-9]*/)
Chris@909: # # use it
Chris@909: # kind = IDENT_KIND[match]
Chris@909: # ...
Chris@909: class WordList < Hash
Chris@909:
Chris@909: # Create a new WordList with +default+ as default value.
Chris@909: def initialize default = false
Chris@909: super default
Chris@909: end
Chris@909:
Chris@909: # Add words to the list and associate them with +value+.
Chris@909: #
Chris@909: # Returns +self+, so you can concat add calls.
Chris@909: def add words, value = true
Chris@909: words.each { |word| self[word] = value }
Chris@909: self
Chris@909: end
Chris@909:
Chris@909: end
Chris@909:
Chris@909:
Chris@909: # A CaseIgnoring WordList is like a WordList, only that
Chris@909: # keys are compared case-insensitively (normalizing keys using +downcase+).
Chris@909: class WordList::CaseIgnoring < WordList
Chris@909:
Chris@909: def [] key
Chris@909: super key.downcase
Chris@909: end
Chris@909:
Chris@909: def []= key, value
Chris@909: super key.downcase, value
Chris@909: end
Chris@909:
Chris@909: end
Chris@909:
Chris@909: end