-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.txt
155 lines (103 loc) · 2.52 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
PROGRAM ::= extern ANY_TYPE LEX_IDENT ( PARAMS ) ; PROGRAM
| DECL_LIST
#################
# Declarations: #
#################
ANY_TYPE ::= void
| VAR_TYPE
VAR_TYPE ::= int
| float
| bool
DECL_LIST ::= DECL DECL_LIST
| epsilon
DECL ::= VAR_TYPE LEX_IDENT DECL_EXT
| void LEX_IDENT FUNC_SPEC
DECL_EXT ::= ;
| FUNC_SPEC
FUNC_SPEC ::= ( PARAMS ) BLOCK
###############
# Parameters: #
###############
PARAMS ::= PARAM PARAM_LIST
| void
| epsilon
PARAM_LIST ::= , PARAM PARAM_LIST
| epsilon
PARAM ::= VAR_TYPE LEX_IDENT
##############
# Structure: #
##############
BLOCK ::= { BLOCK_DECLS STATEMENTS }
BLOCK_DECLS ::= VAR_TYPE LEX_IDENT ; BLOCK_DECLS
| epsilon
STATEMENTS ::= STATEMENT STATEMENTS
| ; STATEMENTS
| epsilon
STATEMENT ::= BLOCK
| IF_BLOCK
| WHILE_BLOCK
| RETURN
| EXPRESSION ;
IF_BLOCK ::= if ( EXPRESSION ) BLOCK ELSE_BLOCK
ELSE_BLOCK ::= else BLOCK
| epsilon
WHILE_BLOCK ::= while ( EXPRESSION ) STATEMENT
RETURN ::= return RETURN_EXT
RETURN_EXT ::= EXPRESSION
| epsilon
###############
# Expression: #
###############
EXPRESSION ::= ATOM_NO_IDENT OP_MULT OP_ADD OP_COMP OP_EQ OP_AND OP_OR
| LEX_IDENT OPT_ASSIGN
OPT_ASSIGN ::= OPT_CALL OP_MULT OP_ADD OP_COMP OP_EQ OP_AND OP_OR
| = EXPRESSION
OP_OR ::= || V_AND OP_OR
| epsilon
V_AND ::= V_EQ OP_AND
OP_AND ::= && V_EQ OP_AND
V_EQ ::= V_COMP OP_EQ
OP_EQ ::= == V_COMP OP_EQ
| != V_COMP OP_EQ
| epsilon
V_COMP ::= V_ADD OP_COMP
OP_COMP ::= <= V_ADD OP_COMP
| < V_ADD OP_COMP
| >= V_ADD OP_COMP
| > V_ADD OP_COMP
| epsilon
V_ADD ::= V_MULT OP_ADD
OP_ADD ::= + V_MULT OP_ADD
| - V_MULT OP-ADD
| epsilon
V_MULT ::= ATOM OP_MULT
OP_MULT ::= * ATOM OP_MULT
| / ATOM OP_MULT
| % ATOM OP_MULT
| epsilon
#######################
# Atomic Expressions: #
#######################
ATOM_NO_IDENT ::= - ATOM_NO_IDENT
| ! ATOM_NO_IDENT
| PARENS_NO_IDENT
ATOM ::= - ATOM
| ! ATOM
| PARENS
PARENS_NO_IDENT ::= ( EXPRESSION )
| VALUE
PARENS ::= ( EXPRESSION )
| LEX_IDENT OPT_CALL
| VALUE
OPT_CALL ::= ( ARGS )
| epsilon
VALUE ::= LEX_INT
| LEX_FLOAT
| LEX_BOOL
##############
# Arguments: #
##############
ARGS ::= EXPRESSION ARG_LIST
| epsilon
ARG_LIST ::= , EXPRESSION ARG_LIST
| epsilon