blob: cc49d8789737a85f2e925e789aeb19d35bfbd93e (
plain)
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
|
<program> ::= { <function_declaration> }
<function_declaration> ::=
"function" <identifier> "(" [ <parameter_list> ] ")"
"->" <type>
<block>
<parameter_list> ::= <parameter> { "," <parameter> }
<parameter> ::= <type> <identifier>
<type> ::= "int"
| "bool"
<block> ::= "{"
<statement_list>
"}"
<statement_list> ::= { <statement> }
<statement> ::= <variable_declaration>
| <assignment_statement>
| <if_statement>
| <while_statement>
| <for_statement>
| <return_statement>
| <expression_statement>
<variable_declaration> ::=
<type> <identifier> [ "=" <expression> ] ";"
<assignment_statement> ::=
<identifier> "=" <expression> ";"
<return_statement> ::=
"return" [ <expression> ] ";"
<expression_statement> ::=
<expression> ";"
<if_statement> ::=
"if" "(" <expression> ")"
<block>
[ "else" <block> ]
<while_statement> ::=
"while" "(" <expression> ")"
<block>
<for_statement> ::=
"for" "("
[ <for_init> ]
";"
[ <expression> ]
";"
[ <expression> ]
")"
<block>
<for_init> ::= <type> <identifier> [ "=" <expression> ]
| <expression>
<expression> ::= <logical_or>
<logical_or> ::= <logical_and>
{ "||" <logical_and> }
<logical_and> ::= <equality>
{ "&&" <equality> }
<equality> ::= <comparison>
{ ( "==" | "!=" ) <comparison> }
<comparison> ::= <term>
{ ( "<" | ">" | "<=" | ">=" ) <term> }
<term> ::= <factor>
{ ( "+" | "-" ) <factor> }
<factor> ::= <unary>
{ ( "*" | "/" | "%" ) <unary> }
<unary> ::= ( "!" | "-" ) <unary>
| <primary>
<primary> ::= <number>
| <boolean>
| <identifier>
| <function_call>
| "(" <expression> ")"
<function_call> ::=
<identifier> "(" [ <argument_list> ] ")"
<argument_list> ::= <expression>
{ "," <expression> }
<identifier> ::= <letter> { <letter> | <digit> }
<number> ::= <digit> { <digit> }
<boolean> ::= "true"
| "false"
<letter> ::= "a" | ... | "z"
| "A" | ... | "Z"
| "_"
<digit> ::= "0" | ... | "9"
|