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