Parent

Class/Module Index [+]

Quicksearch

ClsRuby::Lexers::FirstStage

Класс для выполнения первой стадии лексического анализа: преобразования числовых escape-последовательностей в символы.

Attributes

line_no[R]

Доступ к номеру строки входного потока, на которой остановился разбор.

stream_name[R]

Доступ к имени входного потока.

Public Class Methods

new( stream, stream_name ) click to toggle source

Конструктор.

stream

входной поток. Объект, который предоставляет методы getc и ungetc эквивалентные методам IO#getc и IO#ungetc.

stream_name

имя входного потока.

# 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

Public Instance Methods

next() click to toggle source

Извлечение очередного символа из входного потока.

Возвращает nil при достижении конца потока. Или очередной прочитанный символ.

# File lib/cls-ruby/lexers/first_stage.rb, line 35
def next
  ch = @stream.getc
  if ch
    process_next_char( ch )
  else
    nil
  end
end

Private Instance Methods

parse_digital_escape_seq( escape_leading_symbol ) click to toggle source

Извлечение и обработка числовой последовательности из входного потока и преобразование ее в символ.

escape_leading_symbol

префикс последовательности, который определяет систему счисления.

# 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
process_next_char( ch ) click to toggle source

Обработка очередного извлеченного из входного потока символа. Выполняет проверку на начало числовой 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.