Parent

Class/Module Index [+]

Quicksearch

ClsRuby::Lexers::CharClassifier

Лексический анализатор, который выделяет отдельные символы и классифицирует их. Так же преобразует в символы оставшиеся escape последовательности. Комментарии преобразует в строки с типом :tok_space.

Выделяются следующие категории символов:

:tok_open_block
:tok_close_block
:tok_space
:tok_string
:tok_nonspace
:tok_eof

Constants

EOF

Пара, которая означает, что входной поток завершен.

Public Class Methods

new( stream, stream_name ) click to toggle source
# File lib/cls-ruby/lexers/char_classifier.rb, line 29
def initialize( stream, stream_name )
  @lexer = FirstStage.new( stream, stream_name )
end

Public Instance Methods

line_no() click to toggle source

Возвращает номер строки, на которой остановился разбор.

# File lib/cls-ruby/lexers/char_classifier.rb, line 36
def line_no; @lexer.line_no; end
next() click to toggle source

Извлечение очередной пары.

Возвращается значение 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
stream_name() click to toggle source

Возвращает имя потока.

# File lib/cls-ruby/lexers/char_classifier.rb, line 34
def stream_name; @lexer.stream_name; end

Private Instance Methods

classify_char( ch ) click to toggle source

Определение типа отдельного символа.

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

Инициирует парсинг либо однострочного, либо многострочного комментариев.

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

Преобразование содержащейся во входном потоке хвостовой части 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
parse_multi_line_comment() click to toggle source
# 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
parse_single_line_comment() click to toggle source
# 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
parse_string() click to toggle source

Выделение из входного потока строки.

Вызывается, когда открывающая кавычка уже извлечена. Возвращается значение строки без закрывающей кавычки.

Символ ‘|’ не имеет в строке специального значения. Последовательность | преобразуется к символу ‘|’.

# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.