Class: Lexr
- Inherits:
-
Object
show all
- Defined in:
- lib/lexr.rb
Defined Under Namespace
Classes: Dsl, Rule, Token, UnmatchableTextError
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(text, rules) ⇒ Lexr
Returns a new instance of Lexr.
8
9
10
11
12
|
# File 'lib/lexr.rb', line 8
def initialize(text, rules)
@text, @rules = text, rules
@current = nil
@position = 0
end
|
Class Method Details
.that(&block) ⇒ Object
2
3
4
5
6
|
# File 'lib/lexr.rb', line 2
def self.that(&block)
dsl = Lexr::Dsl.new
block.arity == 1 ? block[dsl] : dsl.instance_eval(&block)
dsl
end
|
Instance Method Details
#current ⇒ Object
32
33
34
|
# File 'lib/lexr.rb', line 32
def current
@current
end
|
#end? ⇒ Boolean
36
37
38
|
# File 'lib/lexr.rb', line 36
def end?
@current == Lexr::Token.end
end
|
#next(peeking = false) ⇒ Object
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/lexr.rb', line 14
def next(peeking = false)
return @current = Lexr::Token.end if @position >= @text.length
@rules.each do |rule|
if result = rule.pattern.instance_of?(Regexp) ? regexp_match(rule.pattern, peeking) : literal_match(rule.pattern, peeking)
result = rule.converter[result] if rule.converter
return self.send(:next) if rule.ignore?
token = Lexr::Token.new(result, rule.symbol)
return @current = token unless peeking
return token
end
end
raise Lexr::UnmatchableTextError.new(unprocessed_text[0..0], @position)
end
|
#peek ⇒ Object
28
29
30
|
# File 'lib/lexr.rb', line 28
def peek
self.send(:next, true)
end
|