-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.txt
122 lines (88 loc) · 2.89 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
program : procedure
procedure : PROCEDURE ID optFormalList IS declList BEGIN stmtList END ID SEMICOLON
| PROCEDURE ID optFormalList SEMICOLON
function : FUNCTION ID optFormalList RETURN typeID IS declList BEGIN stmtList END ID SEMICOLON
| FUNCTION ID optFormalList RETURN typeID SEMICOLON
optFormalList : OPAREN formalList CPAREN
| EMPTY
formalList : formal SEMICOLON formalList
| formal
formal : idList COLON optMode typeID
idList : ID COMMA idList
| ID
optMode : IN
| OUT
| IN OUT
| EMPTY
declList : declaration declList
| EMPTY
declaration : typeDecl | varDecl | procedure | function | package
package : PACKAGE ID IS declList PRIVATE declList END ID SEMICOLON
typeDecl : TYPE ID IS typeDesc SEMICOLON
| TYPE ID SEMICOLON
typeDesc : typeID
| ARRAY OBRACKET rExpr DOUBLE_DOT rExpr CBRACKET OF typeDesc
| RECORD varDeclList END RECORD
varDeclList : varDecl varDeclList
| varDecl
varDecl : idList COLON typeDesc SEMICOLON
typeID : lExpr
| INTEGER
| BOOLEAN
stmtList : statement stmtList
| statement
statement : NULL SEMICOLON
| RETURN SEMICOLON
| RETURN rExpr SEMICOLON
| IF rExpr THEN stmtList optElsifList optElse END IF SEMICOLON
| WHILE rExpr LOOP stmtList END LOOP SEMICOLON
| lExpr OPAREN rExprList CPAREN SEMICOLON
| lExpr ASSIGNMENT rExpr SEMICOLON
optElsifList : elsifList | EMPTY
elsifList : elsif elsifList
| elsif
elsif : ELSIF rExpr THEN stmtList
optElse : ELSE stmtList | EMPTY
rExprList : rExpr COMMA rExprList
| rExpr
lExpr : ID
| ID lExpr2
lExpr2 : OBRACKET rExpr CBRACKET lExpr2
| OBRACKET rExpr CBRACKET
| DOT lExpr
rExpr : rExpr2
| rExpr2 LOGICAL_OR rExpr
rExpr2 : rExpr3
| rExpr3 LOGICAL_AND rExpr2
rExpr3 : rExpr4
| NOT rExpr3
rExpr4 : rExpr5
| rExpr5 EQUALS rExpr4
| rExpr5 NOT_EQUALS rExpr4
rExpr5 : rExpr6
| rExpr6 LESS_THAN rExpr5
| rExpr6 GREATER_THAN rExpr5
| rExpr6 LESS_THAN_EQUAL rExpr5
| rExpr6 GREATER_THAN_EQUAL rExpr5
rExpr6 : rExpr7
| rExpr7 PLUS rExpr6
| rExpr7 MINUS rExpr6
rExpr7 : unary
| unary TIMES rExpr7
| unary DIVIDE rExpr7
| unary MODULUS rExpr7
| U_MINUS rExpr7
unary : lExpr
| constant
| funcCall
| lExpr OPAREN rExprList CPAREN
| IF rExpr THEN rExpr optRExprElsifList ELSE rExpr END IF
| OPAREN rExpr CPAREN
optRExprElsifList : rExprElsifList | EMPTY
rExprElsifList : rExprElsif rExprElsifList
| rExprElsif
rExprElsif : ELSIF rExpr THEN rExpr
constant : NUMBER
| TRUE | FALSE
funcCall : ID OPAREN optRExprList CPAREN
optRExprList : rExprList | EMPTY