-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.txt
126 lines (95 loc) · 2.68 KB
/
grammar.txt
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
expression: number
| expression '*' expression
| expression '/' expression
| expression '+' expression
| expression '-' expression
;
expression: additive_expression
;
additive_expression:
multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
multiplicative_expression: prefix_expression
| multiplicative_expression '*' prefix_expression
| multiplicative_expression '/' prefix_expression
| multiplicative_expression '%' prefix_expression
;
number: INTLIT_T
;
compound_statement: '{' '}' // empty, i.e. no statement
| '{' statement '}'
| '{' statement statements '}'
;
statement: print_statement
| declaration
| assignment_statement
| if_statement
| while_statement
;
print_statement: 'print' '(' expression ')' ';'
;
declaration: 'int' identifier ';'
;
identifier: IDENT_T
;
assignment_statement: identifier '=' expression ';'
;
if_statement: if_head
| if_head 'else' compound_statement
;
if_head: 'if' '(' true_false_expression ')' compound_statement
;
while_statement: 'while' '(' true_false_expression ')' compound_statement
;
for_statement: 'for' preop_statement ';'
true_false_expression ';'
postop_statement ')' compound_statement
;
preop_statement: statement (for now)
postop_statement: statement (for now)
global_declarations: global_declarations
| global_declaration global_declarations
;
global_declaration: function_declaration | var_declaration
;
function_declaration: type identifier '(' ')' compound_statement
;
variable_declaration: type identifier_List ';'
| type identifier '[' P_INTLIT ']' ';'
;
type: type_keyword opt_pointer
;
type_keyword: 'void' | 'char' | 'int' | 'long'
;
opt_pointer: <empty> | '*' opt_pointer
;
identifier_list: identifier | identifier ',' identifier_list
;
function_call : identifier '(' expression ')'
;
return_statement: 'return' '(' expression ')'
;
prefix_expression: postfix_expression
| '++' prefix_expression
| '--' prefix_expression
| prefix_operator prefix_expression
;
primary_expression: T_IDENT
| T_INTLIT
| T_STRLIT
| '(' expression ')'
;
postfix_expression : primary_expression
| postfix_expression '[' expression ']'
| postfix_expression '(' expression ')'
| postfix_expression '++'
| postfix_expression '--'
;
prefix_operator: '&'
| '*'
| '-'
| '~'
| '!'
;