blob: 7b9ff972ef37d1974169ccdc45cc5d96c401bf3d (
plain)
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
|
grammar Toc;
prog: (decl)+ EOF;
decl: varDecl
| funcDecl
| structDecl
;
varDecl: 'var' var;
var: varName (':' type) ('=' expr)?;
type: typeName;
funcDecl: 'func' func;
func: funcName '(' parameter ')' (':' type) body;
parameter: (var (',' var)*)?;
body: '{' stmt* '}';
structDecl: 'struct' structName '{' structMember* '}';
structMember: structVar | structMethod;
structVar: var;
structMethod: func;
stmt: (varDecl
| conditional
| loop
| assignment
| returnStmt
| expr) ;
conditional: ifCond;
ifCond: 'if' expr body;
loop: whileLoop;
whileLoop: 'while' expr body;
assignment: identifier '=' expr;
returnStmt: 'return' expr;
expr: funcCall
| literal
| identifier
| subscript
| memberAccess
| parenExpr
| operatorExpr;
nonOpExpr: funcCall
| literal
| identifier
| subscript
| memberAccess
| parenExpr;
nonSubscriptExpr: funcCall
| literal
| identifier
| memberAccess
| parenExpr;
nonAccessExpr: funcCall
| literal
| identifier
| subscript
| parenExpr
| operatorExpr;
funcCall: funcName '(' (expr (',' expr)*)? ')';
operatorExpr: binaryOperator;
binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*;
identifier: varName;
literal: INTLIT;
subscript: nonSubscriptExpr '[' expr ']';
memberAccess: identifier '.' identifier;
parenExpr: '(' expr ')';
funcName: NAME;
varName: NAME;
typeName: NAME;
structName: NAME;
BINARY_OPERATOR:
'+' | '-' | '*' | '/'
| '==' | '!='
| '<' | '>';
INTLIT: ('+' | '-')? [0-9]+;
NAME: ([a-z] | [A-Z] | [0-9])+;
WS: [ \t\r\n]+ -> skip;
NEWLINE: [\r\n]+;
|