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