|
@@ -9,20 +9,26 @@ module Chervil
|
9
|
9
|
@source[@position]
|
10
|
10
|
end
|
11
|
11
|
|
12
|
|
- def advance
|
13
|
|
- @position += 1
|
|
12
|
+ def advance(step = 1)
|
|
13
|
+ @position += step
|
14
|
14
|
end
|
15
|
15
|
|
16
|
16
|
def get_next_token
|
17
|
17
|
case current_char
|
|
18
|
+ when nil
|
|
19
|
+ Token.new(:eof, "eof")
|
18
|
20
|
when '('
|
19
|
21
|
advance
|
20
|
22
|
Token.new(:lparen, "(")
|
21
|
23
|
when ')'
|
22
|
24
|
advance
|
23
|
25
|
Token.new(:rparen, ")")
|
24
|
|
- when nil
|
25
|
|
- Token.new(:eof, "eof")
|
|
26
|
+ else
|
|
27
|
+ source = @source.slice(@position..-1)
|
|
28
|
+ if match = source.match(/^[0-9]+(\.[0-9]+)?/)
|
|
29
|
+ advance(match[0].size)
|
|
30
|
+ Token.new(:number, match[0])
|
|
31
|
+ end
|
26
|
32
|
end
|
27
|
33
|
end
|
28
|
34
|
|
|
@@ -30,6 +36,7 @@ module Chervil
|
30
|
36
|
tokens = Array.new
|
31
|
37
|
loop do
|
32
|
38
|
token = get_next_token
|
|
39
|
+ next if token.nil?
|
33
|
40
|
tokens << token
|
34
|
41
|
break if token.type == :eof
|
35
|
42
|
end
|