-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lagger.cf
123 lines (62 loc) · 2.03 KB
/
Lagger.cf
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
-- programs ----------------
entrypoints Program ;
PProgram. Program ::= [TopDef] ;
FnDef. TopDef ::= Type Ident "(" [Arg] ")" Block ;
separator nonempty TopDef "" ;
VarArg. Arg ::= Type Ident;
RefArg. Arg ::= Type "&" Ident;
separator Arg "," ;
-- statements -------------
BBlock. Block ::= "{" [Stmt] "}" ;
Empty. Stmt ::= ";" ;
BStmt. Stmt ::= Block ;
Decl. Stmt ::= Type Item ;
NoInit. Item ::= Ident ";" ;
Init. Item ::= Ident "=" Expr ";" ;
DeclFunc. Stmt ::= TopDef ;
Ass. Stmt ::= Ident "=" Expr ";" ;
Ret. Stmt ::= "return" Expr ";" ;
IfCond. Stmt ::= "if" "(" Expr ")" Block ;
CondElse. Stmt ::= "if" "(" Expr ")" Block "else" Block ;
While. Stmt ::= "while" "(" Expr ")" Block ;
SExp. Stmt ::= Expr ";" ;
Break. Stmt ::= "break" ";" ;
Continue. Stmt ::= "continue" ";" ;
separator Stmt "" ;
-- types --------
TInt. Type ::= "int" ;
TStr. Type ::= "string" ;
TBool. Type ::= "boolean" ;
separator Type ",";
-- expressions
EVar. Expr6 ::= Ident ;
ELitInt. Expr6 ::= Integer ;
ELitTrue. Expr6 ::= "true" ;
ELitFalse. Expr6 ::= "false" ;
EApp. Expr6 ::= Ident "(" [Expr] ")" ;
EString. Expr6 ::= String ;
ENeg. Expr5 ::= "-" Expr6 ;
ENot. Expr5 ::= "!" Expr6 ;
EMul. Expr4 ::= Expr4 MulOp Expr5 ;
EAdd. Expr3 ::= Expr3 AddOp Expr4 ;
ERel. Expr2 ::= Expr2 RelOp Expr3 ;
EAnd. Expr1 ::= Expr2 "&&" Expr1 ;
EOr. Expr ::= Expr1 "||" Expr ;
coercions Expr 7 ;
separator Expr "," ;
-- operators -----------------------------------------------
Plus. AddOp ::= "+" ;
Minus. AddOp ::= "-" ;
Times. MulOp ::= "*" ;
Div. MulOp ::= "/" ;
Mod. MulOp ::= "%" ;
LTH. RelOp ::= "<" ;
LE. RelOp ::= "<=" ;
GTH. RelOp ::= ">" ;
GE. RelOp ::= ">=" ;
EQU. RelOp ::= "==" ;
NE. RelOp ::= "!=" ;
-- comments ------------------------------------------------
comment "#" ;
comment "//" ;
comment "/*" "*/" ;