-
Notifications
You must be signed in to change notification settings - Fork 13
/
grammar
98 lines (53 loc) · 1.77 KB
/
grammar
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
digit0 : 0-9
digit : 1-9
letter : a-z | A-Z
otherChar : -ascii-
char : letter | otherChar
num : ('+' | '-')? float
float : (frac exp?) | (int frac? exp?)
int : '0' | digit+ digit0*
frac : '.' int
exp : '^' ('+' | '-')? int
str : quotedStr ('+' quotedStr)*
quotedStr : '"' (char)* '"' (',' obj)*
bool : 'True' | 'False'
null : 'NULL'
var : letter (digit | letter)*
list : '[' (listExpr)? ']'
listElem : var '[' (int | var) ']'
obj : var | num | str | bool | null | list | listElem
listExpr : obj (',' obj)*
#-------- ================ --------#
program : (line ENDLINE)*
ENDLINE : ';' '\n'
line : assign
| input
| output
| ifLine
| loopLine
| breakLine
| contLine
input : readIn var
output : writeOut obj
assign : var '=' expr
expr : pred (condOp expr)?
pred : term ( ('+' | '-') pred)?
term : baseExpr ( ('*' | '/' | '/.' | '%') term)?
baseExpr : obj
| '(' expr ')'
operator : '+' | '-' | '*' | '/' | '/.' | '%' | condOp
condOp : '&&' | '||' | '!=' | '==' | '<=' | '>=' | '>' | '<'
ifLine : if ifCond ifBody
ifCond : '(' expr ')'
ifBody : (line ENDLINE)+ (optElse)?
optElse : else (line ENDLINE)+
loopLine : while ifCond loopBody
loopBody : program
#-------- ================ --------#
readIn : 'readInt' | 'readFloat' | 'readBool' | 'readStr'
writeOut : 'writeOut'
breakLine : 'break'
contLine : 'continue'
if : 'if'
while : 'while'
else : 'else'