Object
Лексический анализатор, который выделяет отдельные символы и классифицирует их. Так же преобразует в символы оставшиеся escape последовательности. Комментарии преобразует в строки с типом :tok_space.
Выделяются следующие категории символов:
:tok_open_block :tok_close_block :tok_space :tok_string :tok_nonspace :tok_eof
Пара, которая означает, что входной поток завершен.
Возвращает номер строки, на которой остановился разбор.
# File lib/cls-ruby/lexers/char_classifier.rb, line 36 def line_no; @lexer.line_no; end
Извлечение очередной пары.
Возвращается значение EOF если достигнут конец потока.
# File lib/cls-ruby/lexers/char_classifier.rb, line 41 def next n = @lexer.next if !n EOF elsif '|' == n parse_comment elsif '"' == n parse_string elsif '\' == n parse_escape_seq else [ n, classify_char( n ) ] end end
Определение типа отдельного символа.
# File lib/cls-ruby/lexers/char_classifier.rb, line 143 def classify_char( ch ) case ch when '{' then :tok_open_block when '}' then :tok_close_block when /[[:space:]]/ then :tok_space else :tok_nonspace end end
Инициирует парсинг либо однострочного, либо многострочного комментариев.
# File lib/cls-ruby/lexers/char_classifier.rb, line 59 def parse_comment n = @lexer.next raise UnclosedVerticalBarSeqEx.new( stream_name, line_no, "unexpected EOF after |" ) unless n if '|' == n parse_single_line_comment elsif '#' == n parse_multi_line_comment else raise InvalidVerticalBarSeqEx.new( stream_name, line_no, "invalid |-sequence: |#{n}" ) end end
Преобразование содержащейся во входном потоке хвостовой части escape-последовательности в отдельный символ.
# File lib/cls-ruby/lexers/char_classifier.rb, line 129 def parse_escape_seq n = @lexer.next case n when /["\\|{}]/ then [ n, :tok_nonspace ] when 'n' then [ "\n", :tok_space ] when 'r' then [ "\r", :tok_space ] when 't' then [ "\t", :tok_space ] else raise InvalidEscapeSeqEx.new( stream_name, line_no, "invalid escape sequence: \\#{n}" ) end end
# File lib/cls-ruby/lexers/char_classifier.rb, line 84 def parse_multi_line_comment start_line_no = line_no result = '|#' while nil != ( n = @lexer.next ) result << n break if result[ -2..-1 ] == '#|' && result.size > 3 end raise UnclosedMultilineCommentEx.new( stream_name, line_no, "unclosed multiline comment started at: " + "#{stream_name}:#{start_line_no}" ) unless n [ result, :tok_space ] end
# File lib/cls-ruby/lexers/char_classifier.rb, line 75 def parse_single_line_comment result = '||' while nil != ( n = @lexer.next ) result << n break if "\n" == n end [ result, :tok_space ] end
Выделение из входного потока строки.
Вызывается, когда открывающая кавычка уже извлечена. Возвращается значение строки без закрывающей кавычки.
Символ ‘|’ не имеет в строке специального значения. Последовательность | преобразуется к символу ‘|’.
# File lib/cls-ruby/lexers/char_classifier.rb, line 108 def parse_string start_line_no = line_no result = '' while nil != ( n = @lexer.next ) if '"' == n return [ result, :tok_string ] elsif '\' == n char, tok = parse_escape_seq result << char else result << n end end raise UnclosedStringEx.new( stream_name, line_no, "unclosed string started at: #{stream_name}:#{start_line_no}" ) end
Generated with the Darkfish Rdoc Generator 2.