-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtapl_parser.py
More file actions
87 lines (67 loc) · 1.74 KB
/
tapl_parser.py
File metadata and controls
87 lines (67 loc) · 1.74 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
'''
Created on 8 Feb 2012
@author: Hens
'''
'''
IMPLEMENT THIS AS THE PARSER FOR ITEMS IN THE GAME
AND POSSIBLY GAME COMMANDS THEMSELVES
http://effbot.org/zone/simple-top-down-parsing.htm
'''
import re
def expression(rbp=0):
global token
t = token
token = next()
left = t.nud()
while rbp < token.lbp:
t = token
token = next()
left = t.led(left)
return left
class int_literal_token:
def __init__(self, value):
self.value = int(value)
def nud(self):
return self.value
class operator_add_token:
lbp = 10
def led(self, left):
right = expression(10)
return left + right
class operator_sub_token:
lbp = 10
def led(self, left):
return left - expression(10)
class operator_mul_token:
lbp = 20
def led(self, left):
return left * expression(20)
class operator_div_token:
lbp = 20
def led(self, left):
return left / expression(20)
class end_token:
lbp = 0
token_pat = re.compile("\s*(?:(\d+)|(.))")
def tokenize(program):
for number, operator in token_pat.findall(program):
if number:
yield int_literal_token(number)
elif operator == "+":
yield operator_add_token()
elif operator == "*":
yield operator_mul_token()
elif operator == "/":
yield operator_div_token()
elif operator == "-":
yield operator_sub_token()
else:
raise SyntaxError("unknown operator")
yield end_token()
def parse(program):
global token, next
next = tokenize(program).next
token = next()
return expression()
print parse("1 + 2")
print parse("1 + 2 / 3 + 20 - 10 * 6")