-
Notifications
You must be signed in to change notification settings - Fork 0
/
refl.ungram
104 lines (71 loc) · 1.75 KB
/
refl.ungram
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
Program = Item*
Item =
StructDef
| EnumDef
| FunctionDef
StructDef = 'struct' name:'ident' body:Record
Record = '{' ( Param ','? )* '}'
EnumDef = 'enum' name:'ident' '{' ( ( variant:'ident' body:Record? ) ','? )* '}'
FunctionDef = 'fn' name:'ident' '(' ( Param ','? )* ')' ( '->' return_ty:Type )? body:Block
Param = name:'ident' ':' ty:Type
Type =
FunctionType
| ArrayType
| PtrType
| CustomType
FunctionType = 'fn' '(' ( ty:Type ','? )* ')' ( '->' return_ty:Type )?
ArrayType = '[' ty:Type ']'
PtrType = '&' ty:Type
CustomType = name:'ident'
Block = '{' Stmt* '}'
Stmt =
';'
| ExprStmt
| LetStmt
| IfStmt
| ForStmt
| WhileStmt
| BreakStmt
| ContinueStmt
| ReturnStmt
| Item
ExprStmt = Expr ';'
LetStmt = 'let' ( ':' ty:Type )? '=' value:Expr ';'
IfStmt = 'if' condition:Expr then_branch:Block ( 'else' else_branch:ElseStmt )?
ElseStmt = IfStmt | Block
ForStmt = 'for' binding:'ident' 'in' iterator:Expr body:Block
WhileStmt = 'while' condition:Expr body:Block
BreakStmt = 'break' ';'
ContinueStmt = 'continue' ';'
ReturnStmt = 'return' value:Expr? ';'
Expr =
LiteralExpr
| InfixExpr
| PrefixExpr
| ParenExpr
| CallExpr
| ArrayExpr
| IndexExpr
| StructExpr
LiteralExpr =
'int'
| 'float'
| 'true'
| 'false'
| 'char'
| 'string'
| 'ident'
InfixExpr = lhs:Expr op:InfixOp rhs:Expr
InfixOp =
'+' | '-' | '*' | '/' | '%'
| '==' | '!='
| '<' | '<=' | '>' | '>='
| '&&' | '||'
| '=' | '+=' | '-=' | '*=' | '/=' | '%='
PrefixExpr = op:PrefixOp child:Expr
PrefixOp = '+' | '-' | '!' | '&' | '*'
ParenExpr = '(' child:Expr ')'
CallExpr = child:Expr '(' args:( arg:Expr ','? )* ')'
ArrayExpr = '[' values:( value:Expr ','? )* ']'
IndexExpr = array:Expr '[' index:Expr ']'
StructExpr = name:'ident' '{' fields:( field:( name:'ident' ':' value:Expr ) ','? )* '}'