-
Notifications
You must be signed in to change notification settings - Fork 1
/
__init__.py
98 lines (86 loc) · 1.57 KB
/
__init__.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
import ply.lex as lex
class LexerError(Exception): pass
reserved = {
'if' : 'IF',
'else' : 'ELSE',
'done' : "DONE",
'return': "RETURN",
"const" : "CONST",
"let": "LET",
'int': 'INTTYPE',
'float': 'FLOATTYPE',
'char': 'CHARTYPE',
'function': 'FUNCTIONTYPE',
}
tokens = [
"INT",
"FLOAT",
"PLUS",
"MULTI",
"DIV",
"SUB",
"NAME",
"LPAREN",
"RPAREN",
"COLON",
"COMMA",
"SEMICOLON",
"ARROW",
"EQ",
"OCT",
"HEX",
'GT',
'LT',
'GTE',
'LTE',
] + list(reserved.values())
t_INT = r'-?[1-9]+[0-9]*'
t_HEX = r'0x[0-9a-fA-F]*'
t_OCT = r'0[0-9]*'
t_FLOAT = r'-?[0-9]*\.[0-9]+'
t_PLUS = r'\+'
t_MULTI = r'\*'
t_DIV = r'\/'
t_SUB = r'-'
# t_NAME = r'[a-zA-Z_]+([a-zA-Z0-9_])*'
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_COLON = r'\:'
t_COMMA = r'\,'
t_SEMICOLON = r'\;'
t_ARROW = r'\-\>'
t_EQ = r'='
t_LT = r'<'
t_GT = r'>'
t_LTE = r'<='
t_GTE = r'>='
t_ignore = ' \t'
def t_NAME(t):
r'\b[a-zA-Z_]+([a-zA-Z0-9_])*\b'
print("this is a name:", t.value)
t.type = reserved.get(t.value, "NAME")
return t
def t_NEWLINE(t):
r'\n+'
t.lexer.lineno += len(t.value)
def t_BLOCKCOMMNET(t):
r'/\*(.|\n)*\*/'
pass
def t_COMMENT(t):
r'//.*'
pass
def t_error(t):
print("Illegal character '%s'" % t.value[0])
raise LexerError()
lexer = lex.lex()
def lex(data):
lexer.input(data)
# Tokenize
tokens = []
while True:
tok = lexer.token()
if not tok:
break # No more input
tokens.append(tok)
pass
return tokens