-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpl0lex.py
79 lines (72 loc) · 1.6 KB
/
pl0lex.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
import ply.lex as lex
reserved = {
'odd':'odd_token',
'begin':'begin_token',
'end':'end_token',
'if':'if_token',
'then':'then_token',
'while':'while_token',
'do':'do_token',
'call':'call_token',
'const':'const_token',
'var':'var_token',
'procedure':'proc_token',
'write':'write_token',
'read':'read_token',
'else':'else_token'
}
tokens = [
'ident_token',
'number_token',
'plus_token', # +
'minus_token', # -
'mul_token', # *
'divide_token', # /
'eql_token', # =
'neq_token', # <>
'leq_token', # <=
'les_token', # <
'geq_token', # >=
'grt_token', # >
'lparent_token', # (
'rparent_token',# )
'comma_token', # ,
'semicolom_token', # ;
'period_token', # .
'become_token', # :=
] + list(reserved.values())
def t_ident_token(t):
r'[a-zA-Z_][a-zA-Z_0-9]*'
if t.value in reserved:
t.type = reserved.get(t.value,'IDENTSYM')
return t
def t_number_token(t):
r'\d+'
t.value = int(t.value)
return t
t_plus_token = r'\+'
t_minus_token = r'\-'
t_mul_token = r'\*'
t_divide_token = r'/'
t_eql_token = r'='
t_neq_token = r'<>'
t_leq_token = r'<='
t_les_token = r'<'
t_geq_token = r'>='
t_grt_token = r'>'
t_lparent_token = r'\('
t_rparent_token = r'\)'
t_comma_token = r','
t_period_token = r'\.'
t_become_token = r':='
t_semicolom_token = r';'
t_ignore = ' \t'
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
def t_comment(t):
r'\\\\.*'
pass