class Lexr

This is a wrapper class for creating a generalized lexer.

Public Class Methods

new(text, rules, default_rule, counter) click to toggle source
# File libs/lexer.rb, line 67
      def initialize(text, rules, default_rule, counter)
              @text, @rules, @default_rule = text, rules, default_rule
              @current = nil
              @position = 0
  @counter=counter
end
setup(&block) click to toggle source
# File libs/lexer.rb, line 61
def self.setup(&block)
        dsl = Lexr::Dsl.new
        block.arity == 1 ? block[dsl] : dsl.instance_eval(&block)
        dsl
end

Public Instance Methods

counter(symbol) click to toggle source
# File libs/lexer.rb, line 133
def counter(symbol)
  @counter[symbol]
end
end?() click to toggle source
# File libs/lexer.rb, line 129
      def end?
              @current == Lexr::Token.end
end
join_escape(tokens) click to toggle source
# File libs/lexer.rb, line 83
def join_escape(tokens)
  tmp=[]
  escapes=0
  tokens=tokens.map do |i|
    if i.kind==:escape
      escapes+=1
      tmp<<i.value
      nil
    elsif escapes>0 && i.kind!=:end
      escapes=0
      tmp<<i.value
      token=Token.new(tmp.join.to_s,:escape)
      tmp=[]
      token
    else
      i
    end
  end.compact
  if escapes>0
    tokens[-1]=Token.new(tmp.join.to_s,:escape)
    tokens<<Lexr::Token.end
  end
  tokens
end
next() click to toggle source
# File libs/lexer.rb, line 108
    def next
            return @current = Lexr::Token.end if @position >= @text.length
@res=""
            @rules.each do |rule|
  @res = rule.match(unprocessed_text)
              next unless @res

  raise Lexr::UnmatchableTextError.new(rule.raises, :position=>@position,:invalid_str=>@text) if @res and rule.raises?

              @position += @res.characters_matched
              return self.next if rule.ignore?
              return @current = @res.token
end
if !@default_rule.nil?
  @res=@default_rule.match(unprocessed_text)
  @position += @res.characters_matched
  return @current = @res.token
end
            raise Lexr::UnmatchableTextError.new(unprocessed_text[0..0], :position=>@position,:invalid_str=>@text)
    end
parse() click to toggle source
# File libs/lexer.rb, line 74
def parse
  tokens=[]
  until self.end?
    tokens << self.next
  end

  join_escape(tokens)
end

Private Instance Methods

unprocessed_text() click to toggle source
# File libs/lexer.rb, line 139
def unprocessed_text
        @text[@position..-1]
end