-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathGrammar
60 lines (33 loc) · 1.46 KB
/
Grammar
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
program: const_decl* declaration* ENDMARKER
# statement
stmt: flow_stmt | '{' stmt* '}' | NAME [stmt_trailer] ';' | ';'
stmt_trailer: arglist | ['[' expr ']'] '=' expr
flow_stmt: if_stmt | for_stmt | while_stmt | read_stmt ';' | write_stmt ';' | return_stmt ';'
return_stmt: 'return' ['(' expr ')']
if_stmt: 'if' '(' condition ')' stmt ['else' stmt]
condition: expr ('<'|'<='|'>'|'>='|'!='|'==') expr | expr
for_stmt: ('for' '(' NAME '=' expr ';' condition ';'
NAME '=' NAME ('+'|'-') NUMBER ')' stmt)
while_stmt: 'while' '(' condition ')' stmt
arglist: '(' expr (',' expr)* ')'
read_stmt: 'scanf' '(' NAME (',' NAME)* ')'
write_stmt: 'printf' '(' (expr|STRING [',' expr]) ')'
compound_stmt: '{' const_decl* var_decl* stmt* '}'
# expression
expr: term (('+'|'-') term)*
term: factor (('*'|'/') factor)*
factor: ('+'|'-') factor | atom
atom: NAME [ atom_trailer ] | NUMBER | CHAR | '(' expr ')'
atom_trailer: '[' expr ']' | arglist
# declaration
var_decl: type_name var_item (',' var_item)* ';'
var_item: NAME [subscript2]
const_decl: 'const' type_name const_item (',' const_item)* ';'
const_item: NAME '=' (integer | CHAR)
type_name: 'int' | 'char' | 'void'
# main is the only one that has an empty ()
declaration: type_name (NAME decl_trailer | 'main' '(' ')' compound_stmt )
decl_trailer: [ paralist ] compound_stmt | [subscript2] (',' var_item)* ';'
paralist: '(' type_name NAME (',' type_name NAME)* ')'
subscript2: '[' NUMBER ']'
integer: ['+'|'-'] NUMBER