-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokens.rb
executable file
·50 lines (45 loc) · 1.06 KB
/
tokens.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Tokens
class Atom
def self.expect s
tmp = ""
if (c = s.peek) && ((?a .. ?z).member?(c) || (?A .. ?Z).member?(c))
tmp += s.get
while (c = s.peek) && ((?a .. ?z).member?(c) ||
(?A .. ?Z).member?(c) ||
(?0 .. ?9).member?(c) || ?_ == c)
tmp += s.get
end
end
return nil if tmp == ""
return tmp.to_sym
end
end
class Int
def self.expect s
tmp = ""
tmp += s.get if s.peek == ?-
while (c = s.peek) && (?0 .. ?9).member?(c)
tmp += s.get
end
return nil if tmp == ""
tmp.to_i
end
end
class Quoted
def self.escaped(s)
return nil if s.peek == ?"
if s.expect("\\")
raised "Unexpected EOF" if !s.peek
return "\\"+s.get
end
return s.get
end
def self.expect s
return nil if !s.expect('"')
buf = ""
while (e = escaped(s)); buf += e; end
raise "Unterminated string" if !s.expect('"')
return buf
end
end
end