Object
Класс для выполнения первой стадии лексического анализа: преобразования числовых escape-последовательностей в символы.
Конструктор.
входной поток. Объект, который предоставляет методы getc и ungetc эквивалентные методам IO#getc и IO#ungetc.
имя входного потока.
# File lib/cls-ruby/lexers/first_stage.rb, line 24 def initialize( stream, stream_name ) @stream = stream @stream_name = stream_name @line_no = 1 end
Извлечение и обработка числовой последовательности из входного потока и преобразование ее в символ.
префикс последовательности, который определяет систему счисления.
# File lib/cls-ruby/lexers/first_stage.rb, line 75 def parse_digital_escape_seq( escape_leading_symbol ) enabled_chars, base, max_len = case escape_leading_symbol when /b/ [ /[01]/, 2, 8 ] when /o/ [ /[0-7]/, 8, 3 ] when /x/ [ /[[:xdigit:]]/, 16, 2 ] end tmp = '' for i in 1..max_len n = @stream.getc break unless n if enabled_chars =~ n tmp << n else # Найден первый символ, который не принадлежит # escape-последовательности. Просмотр можно завершать. @stream.ungetc( n ) break end end raise UnclosedEscapeSeqEx.new( stream_name, line_no, "zero length digital escape sequence \\#{escape_leading_symbol}" ) if 0 == tmp.size tmp.to_i( base ).chr end
Обработка очередного извлеченного из входного потока символа. Выполняет проверку на начало числовой escape-последовательности.
Возвращает либо переданный ему в качестве аргумента символ, либо содержащийся в escape-последовательности символ.
# File lib/cls-ruby/lexers/first_stage.rb, line 51 def process_next_char( ch ) if '\' == ch n = @stream.getc raise UnclosedEscapeSeqEx.new( stream_name, line_no, "unexpected EOF after \\" ) unless n case n when /[obx]/ parse_digital_escape_seq( n ) else @stream.ungetc( n ) ch end else @line_no += 1 if "\n" == ch ch end end
Generated with the Darkfish Rdoc Generator 2.