Class: Lexr

Inherits:
Object
  • 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

#currentObject



32
33
34
# File 'lib/lexr.rb', line 32

def current
	@current
end

#end?Boolean

Returns:

  • (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

#peekObject



28
29
30
# File 'lib/lexr.rb', line 28

def peek
	self.send(:next, true)
end