forked from lkesteloot/turbopascal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbnf
328 lines (203 loc) · 4.74 KB
/
bnf
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
Pascal _ Syntax in BNF Notation
BNF (Backus Naur Form).
pascal_program:
program identifier program_headingopt ; block .
program_heading:
( identifier_list )
identifier_list:
identifier
identifier_list , identifier
block:
block1
label_declaration ; block1
block1:
block2
constant_declaration ; block2
block2:
block3
type_declaration ; block3
block3:
block4
variable_declaration ; block4
block4:
block5
proc_and_func_declaration ; block5
block5:
begin statement_list end
label_declaration:
label unsigned_integer
label_declaration , unsigned_integer
constant_declaration:
const identifier = constant
constant_declaration ; identifier = constant
type_declaration:
type identifier = type
type_declaration ; identifier = type
variable_declaration:
var variableid_list : type
variable_declaration ; variableid_list : type
variableid_list:
identifier
variableid_list , identifier
constant:
integer
real
string
constid
+ constid
TADD_ constid
type:
simple_type
structured_type
^ typeid
simple_type:
( identifier_list )
constant ... constant
typeid
structured_type:
array [ index_list ] of type
record field_list end
set of simple_type
file of type
packed structured_type
index_list:
simple_type
index_list , simple_type
field_list:
fixed_part
fixed_part ; variant_part
variant_part
fixed_part:
record_field
fixed_part ; record_field
record_field:
empty
fieldid_list : type
fieldid_list:
identifier
fieldid_list , identifier
variant_part:
case tag_field of variant_list
tag_field:
typeid
identifier : typeid
variant_list:
variant
variant_list ; variant
variant:
empty
case_label_list : ( field_list )
case_label_list:
constant
case_label_list , constant
proc_and_func_declaration:
proc_or_func
proc_and_func_declaration ; proc_or_func
proc_or_func:
procedure identifier parametersopt ; block_or_forward
function identifier parametersopt : typeid ; block_or_forward
block_or_forward:
block
forward
parameters:
( formal_parameter_list )
formal_parameter_list:
formal_parameter_section
formal_parameter_list ; formal_parameter_section
formal_parameter_section:
parameterid_list : typeid
var parameterid_list : typeid
procedure identifier parametersopt
function identifier parametersopt : typeid
parameterid_list:
identifier
parameterid_list , identifier
statement_list:
statement
statement_list ; statement
statement:
empty
variable := expression
begin statement_list end
if expression then statement
if expression then statement else statement
case expression of case_list end
while expression do statement
repeat statement_list until expression
for varid := for_list do statement
procid
procid ( expression_list )
goto label
with record_variable_list do statement
label : statement
variable:
identifier
variable [ subscript_list ]
variable . fieldid
variable ^
subscript_list:
expression
subscript_list , expression
case_list:
case_label_list : statement
case_list ; case_label_list : statement
for_list:
expression to expression
expression downto expression
expression_list:
expression
expression_list , expression
label:
unsigned_integer
record_variable_list:
variable
record_variable_list , variable
expression:
expression relational_op additive_expression
additive_expression
relational_op: one of
< <= = <> => >
additive_expression:
additive_expression additive_op multiplicative_expression
multiplicative_expression
additive_op: one of
+ _ or
multiplicative_expression:
multiplicative_expression multiplicative_op unary_expression
unary_expression
multiplicative_op: one of
* / div mod and in
unary_expression:
unary_op unary_expression
primary_expression
unary_op: one of
+ _ not
primary_expression:
variable
unsigned_integer
unsigned_real
string
nil
funcid ( expression_list )
[ element_list ]
( expression )
element_list:
empty
element
element_list , element
element:
expression
expression ... expression
constid:
identifier
typeid:
identifier
funcid:
identifier
procid:
identifier
fieldid:
identifier
varid:
identifier
empty: