abouttreesummaryrefslogcommitdiff
path: root/Toc.g4
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]+;