Object
Лексический анализатор, который объединяет в одну лексему последовательность токенов :tok_space и :tok_nonspace.
# File lib/cls-ruby/lexers/lexer.rb, line 19 def initialize( stream, stream_name ) @classifier = CharClassifier.new( stream, stream_name ) # Содержит последний извлеченный из входного потока токен, # который не является :tok_space или :tok_nonspace. # Если равен nil, то из потока нужно извлекать следующий символ. @last_unprocessed_pair = nil end
# File lib/cls-ruby/lexers/lexer.rb, line 29 def line_no; @classifier.line_no; end
Извлечение очередной лексемы.
Возвращает значение EOF, если достигнут конец потока.
# File lib/cls-ruby/lexers/lexer.rb, line 34 def next pair = get_next_pair if :tok_space == pair[ 1 ] || :tok_nonspace == pair[ 1 ] union_sequence( pair ) else pair end end
Извлечение очередной лексемы из потока.
Если есть необработанная лексема в @last_unprocessed_pair, то возвращается она без использования потока.
# File lib/cls-ruby/lexers/lexer.rb, line 48 def get_next_pair n = @last_unprocessed_pair; @last_unprocessed_pair = nil n = @classifier.next unless n n end
Объединение всех последовательно идущих лексем в одну, если они совпадают с первой лексемой.
# File lib/cls-ruby/lexers/lexer.rb, line 56 def union_sequence( first ) result = first.dup while EOF != ( n = @classifier.next ) if result[ 1 ] == n[ 1 ] result[ 0 ] << n[ 0 ] else @last_unprocessed_pair = n break end end result end
Generated with the Darkfish Rdoc Generator 2.