-
Notifications
You must be signed in to change notification settings - Fork 0
/
gram.txt
70 lines (69 loc) · 3.69 KB
/
gram.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
program := PROGRAM ID ';' block '.'
id_list := NAME { ',' NAME }
block := declaration_part statement_part
declaration_part := { label_declaration_part | constant_definition_part |
| type_definition_part | variable_declaration_part
| procedure_declaration | function_declaration }
label_declaration_part := LABEL UINT { ',' UINT } ';'
constant_definition_part := CONST NAME '=' constant ';'
{ NAME '=' constant ';' }
constant= [ '+' | '-' ] ( CONSTANT_NAME | NUMBER | ENUM | CHAR ) | STRING
type_definition_part := TYPE NAME '=' type ';' { NAME '=' type ';' }
type := simple_type | structured_type | procedure_type | function_type | TYPE_NAME
simple_type := subrange_type | enumerated_type
subrange_type := constant '..' constant
enumerated_type := '(' id_list ')'
structured_type := [ PACKED ] unpacked_structured_type
unpacked_structured_type := array_type | record_type
array_type := ARRAY '[' ( simple_type | TYPE_NAME) { ',' ( simple_type | TYPE_NAME) } ']' OF type
record_type := RECORD field_list END
field_list := ( fixed_part [ ';' variant_part ] | variant_part )
fixed_part := id_list ':' type { ';' id_list ':' type }
variant_part := CASE [NAME ':'] TYPE_NAME OF variant { ';' variant }
variant := case_label_list ':' '(' field_list ')'
case_label_list := constant { ',' constant }
procedure_type := PROCEDURE [ formal_parameter_list ]
function_type := FUNCTION [ formal_parameter_list ] ':' TYPE_NAME
formal_parameter_list := '(' formal_parameter_section
{ ';' formal_parameter_section } ')'
formal_parameter_section := [ VAR ] id_list ':' TYPE_NAME
variable_declaration_part := VAR id_list ':' type ';'
{ id_list ':' type ';' }
procedure_declaration := PROCEDURE NAME [ formal_parameter_list ] ';' block .
function_declaration := FUNCTION NAME [ formal_parameter_list ] ':' TYPE_NAME ';' block .
statement_part := BEGIN statement_sequence END
statement_sequence := statement { ';' statement }
statement := [ LABEL_ID ':' ] ( simple_statement | structured_statement )
simple_statement := [ assignment_statement | procedure_statement
| goto_statement ]
assignment_statement := variable_access ':=' expression
variable_access := VARIABLE_NAME { array_access_ | record_access_ }
array_access_ := '[' expression { ',' expression } ']'
expression := simple_expression [ relational_operator simple_expression ]
relational_operator= '=' | '<>' | '<' | '<=' | '>' | '>='
simple_expression := [ '+' | '-' ] term { addition_operator term }
addition_operator := '+' | '-' | OR
term := factor { multiplication_operator factor }
multiplication_operator := '*' | '/' | DIV | AND .
factor := NUMBER | STRING | CHAR | CONSTANT_NAME | ENUM_VALUE
| variable_access | function_designator
| '(' expression ')' | NOT factor
function_designator := FUNCTION_NAME [ '(' expression { ',' expression } ')' ]
record_access_ := '.' ATTRIBUTE_NAME
procedure_statement := ((PROCEDURE_NAME | 'write') [ '(' expression { ',' expression } ')' ])
| 'read' '(' variable_access {',' variable_access } ')'
goto_statement := GOTO NUMBER
structured_statement := compound_statement | repetitive_statement
| conditional_statement .
compound_statement := BEGIN statement_sequence END
repetitive_statement := while_statement | repeat_statement
| for_statement .
while_statement := WHILE expression DO statement
repeat_statement := REPEAT statement_sequence UNTIL expression
for_statement := FOR variable_access ':=' expression
( TO | DOWNTO ) expression DO statement
conditional_statement := if_statement | case_statement
if_statement := IF expression THEN statement [ ELSE statement ]
case_statement := CASE expression OF case_label_list ':' statement { ';' case_label_list ':' statement }
END
case_element := case_label_list ':' statement