-
Notifications
You must be signed in to change notification settings - Fork 0
/
_test_parser.py
86 lines (65 loc) · 1.64 KB
/
_test_parser.py
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
from plex import Lexer
from pison import Parser
class MyLexer(Lexer):
__(r'\+')('ADD')
__(r'\-')('SUB')
__(r'\*')('MUL')
__(r'\/')('DIV')
@__(r'[0-9]+')
def t_sub(self, t):
t.type = 'NUMBER'
t.value = int(t.value)
return t
__(r'\n')('EOL')
__(r'[ \t]')(None)
class MyParser(Parser):
@__('calclist', ('exp', 'EOL'))
def t_calclist_1(self, p):
print('>> ' + str(p[1]))
@__('calclist', ('calclist', 'exp', 'EOL'))
def t_calclist_2(self, p):
print('>> ' + str(p[2]))
@__('exp', 'factor')
def t_exp_factor(self, p):
p[0] = p[1]
@__('exp', 'exp', 'ADD', 'factor')
def t_exp_add(self, p):
p[0] = p[1] + p[3]
@__('exp', 'exp', 'SUB', 'factor')
def t_exp_sub(self, p):
p[0] = p[1] - p[3]
@__('factor', 'term')
def t_factor_term(self, p):
p[0] = p[1]
@__('factor', 'factor', 'MUL', 'term')
def t_factor_mul(self, p):
p[0] = p[1] * p[3]
@__('factor', 'factor', 'DIV', 'term')
def t_factor_div(self, p):
if p[3] == 0:
raise SyntaxError('DIV BY ZERO')
p[0] = p[1] / p[3]
@__('term', 'NUMBER')
def t_term_number(self, p):
p[0] = p[1]
@__('calclist', [('error', 'EOL'), ('calclist', 'error', 'EOL')])
def t_error(self, p):
pass
def error(self, msg):
print(f'[SYNTAX ERROR] {msg}')
lex = MyLexer()
par = MyParser(debug=True)
# print(par._hdlrs)
# print(par._prods)
# print(par._nonterminals)
# print(par._precedence_map)
par.grammar.print_analysis_table()
lex.input('''\
2+3
24/6+9
8*
8*+
10/0+1*9
1+2+3
''')
par.parse(lex)