-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.py
More file actions
105 lines (85 loc) · 2.78 KB
/
Copy pathparser.py
File metadata and controls
105 lines (85 loc) · 2.78 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import ply.yacc as yacc # type: ignore
from lexer import tokens
had_error = False
def p_program(p):
'''program : statement_list'''
pass
def p_statement_list(p):
'''statement_list : statement_list statement
| statement'''
pass
def p_statement(p):
'''statement : var_decl
| array_decl
| func_def
| selection
| iteration
| return_stmt
| assignment
| empty'''
pass
def p_var_decl(p):
'''var_decl : VAR IDENTIFIER SEMICOLON
| VAR IDENTIFIER ASSIGN expression SEMICOLON
| LET IDENTIFIER SEMICOLON
| LET IDENTIFIER ASSIGN expression SEMICOLON
| CONST IDENTIFIER ASSIGN expression SEMICOLON'''
pass
def p_array_decl(p):
'''array_decl : VAR IDENTIFIER ASSIGN LBRACKET array_elements RBRACKET SEMICOLON'''
pass
def p_array_elements(p):
'''array_elements : array_elements COMMA expression
| expression
| empty'''
pass
def p_func_def(p):
'''func_def : FUNCTION IDENTIFIER LPAREN param_list RPAREN LBRACE statement_list RBRACE'''
pass
def p_param_list(p):
'''param_list : param_list COMMA IDENTIFIER
| IDENTIFIER
| empty'''
pass
def p_selection(p):
'''selection : IF LPAREN expression RPAREN statement
| IF LPAREN expression RPAREN LBRACE statement_list RBRACE
| IF LPAREN expression RPAREN statement ELSE statement
| IF LPAREN expression RPAREN LBRACE statement_list RBRACE ELSE LBRACE statement_list RBRACE
| IF LPAREN expression RPAREN LBRACE statement_list RBRACE ELSE selection'''
pass
def p_iteration(p):
'''iteration : FOR LPAREN var_decl expression SEMICOLON assignment RPAREN LBRACE statement_list RBRACE
| WHILE LPAREN expression RPAREN LBRACE statement_list RBRACE'''
pass
def p_return_stmt(p):
'''return_stmt : RETURN expression SEMICOLON'''
pass
def p_assignment(p):
'''assignment : IDENTIFIER ASSIGN expression SEMICOLON'''
pass
def p_expression(p):
'''expression : expression PLUS term
| expression MINUS term
| expression GT term
| expression LT term
| expression EQEQ term
| expression NEQ term
| term'''
pass
def p_term(p):
'''term : NUMBER
| IDENTIFIER
| STRING'''
pass
def p_empty(p):
'empty :'
pass
def p_error(p):
global had_error
had_error = True
if p:
print(f"Syntax error at '{p.value}' (line {p.lineno})")
else:
print("Syntax error at EOF")
parser = yacc.yacc()