-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfrontend_styles.py
104 lines (73 loc) · 1.67 KB
/
frontend_styles.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import preamble
from metaparse import *
table = {}
# Clean style
class G_Calc(metaclass=cfg):
IGNORED = r'\s+'
EQ = r'='
NUM = r'[0-9]+'
ID = r'[_a-zA-Z]\w*'
POW = r'\*\*', 3
MUL = r'\*' , 2
ADD = r'\+' , 1
# ERROR handler?
def assign(ID, EQ, expr):
table[ID] = expr
def expr(NUM):
return int(NUM)
def expr(ID):
return table[ID]
def expr(expr_1, ADD, expr_2):
return expr_1 + expr_2
def expr(expr, MUL, expr_1):
return expr * expr_1
def expr(expr, POW, expr_1):
return expr ** expr_1
# Handler style
class G_Calc():
def IGNORED(lex: r'\v'):
pass
def IGNORED(lex: r'\\'):
pass
def ERROR(lex: r'\t'):
print('ERROR')
def UNRECOGNIZED(lex: r'.'):
pass
# Terminals
def NUM(lex: r'\d+'):
return int(lex)
def ID(lex: r'[_a-zA-Z]\w*'):
return lex
def L(lex: r'\('):
return lex
def R(lex: r'\)'):
return lex
L2 = r'\['
R2 = r'\]'
def PLUS(lex: r'\+') -> 1:
return lex
def POW(lex: r'\*\*') -> 3:
return lex
def TIMES(lex: r'\*') -> 2:
return lex
# Nonterminals
def assign(ID: r'[_a-zA-Z]\w*',
EQ: '=',
expr):
table[ID] = expr
def expr(NUM):
return NUM
def expr(expr_1, ADD: r'\+', expr_2):
return expr_1 + expr_2
# Decorator style
def lex(pat, p=0):
def _(func):
return (func.__name__, pat, p, func)
return _
class G_Calc():
@lex(r'\s+', 3)
def IGNORED(val):
pass
@lex(r'\t', 2)
def ERROR(val):
print('ERROR!')