]> gitweb.ps.run Git - toc/blob - Toc.g4
toc now uses internal representation instead of ast
[toc] / Toc.g4
1 grammar Toc;\r
2 \r
3 prog: (decl)+ EOF;\r
4 \r
5 decl: varDecl\r
6     | funcDecl\r
7     | structDecl\r
8     ;\r
9 \r
10 varDecl:  'var' var;\r
11 var:  varName (':' type) ('=' expr)?;\r
12 \r
13 type: typeName;\r
14 \r
15 \r
16 funcDecl: 'func' func;\r
17 func: funcName '(' parameter ')' (':' type) body;\r
18 parameter: (var (',' var)*)?;\r
19 \r
20 body: '{' stmt* '}';\r
21 \r
22 \r
23 structDecl: 'struct' structName '{' structMember* '}';\r
24 structMember: structVar | structMethod;\r
25 structVar: var;\r
26 structMethod: func;\r
27 \r
28 \r
29 stmt: (varDecl\r
30      | conditional\r
31      | loop\r
32      | assignment\r
33      | returnStmt\r
34      | expr) ;\r
35 \r
36 conditional: ifCond;\r
37 ifCond: 'if' expr body;\r
38 \r
39 loop: whileLoop;\r
40 whileLoop: 'while' expr body;\r
41 \r
42 assignment: identifier '=' expr;\r
43 \r
44 returnStmt: 'return' expr;\r
45 \r
46 expr: funcCall\r
47     | literal\r
48     | identifier\r
49     | subscript\r
50     | memberAccess\r
51     | parenExpr\r
52     | operatorExpr;\r
53 \r
54 nonOpExpr: funcCall\r
55          | literal\r
56          | identifier\r
57          | subscript\r
58          | memberAccess\r
59          | parenExpr;\r
60 \r
61 nonSubscriptExpr: funcCall\r
62                 | literal\r
63                 | identifier\r
64                 | memberAccess\r
65                 | parenExpr;\r
66 \r
67 nonAccessExpr: funcCall\r
68              | literal\r
69              | identifier\r
70              | subscript\r
71              | parenExpr\r
72              | operatorExpr;\r
73 \r
74 funcCall: funcName '(' (expr (',' expr)*)? ')';\r
75 \r
76 operatorExpr: binaryOperator;\r
77 binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*;\r
78 \r
79 identifier: varName;\r
80 \r
81 literal: INTLIT;\r
82 \r
83 subscript: nonSubscriptExpr '[' expr ']';\r
84 \r
85 memberAccess: identifier '.' identifier;\r
86 \r
87 parenExpr: '(' expr ')';\r
88 \r
89 funcName: NAME;\r
90 varName: NAME;\r
91 typeName: NAME;\r
92 structName: NAME;\r
93 \r
94 \r
95 BINARY_OPERATOR:\r
96     '+'  | '-'  | '*' | '/'\r
97   | '==' | '!='\r
98   | '<'  | '>';\r
99 INTLIT: ('+' | '-')? [0-9]+;\r
100 NAME: ([a-z] | [A-Z] | [0-9])+;\r
101 WS: [ \t\r\n]+ -> skip;\r
102 NEWLINE: [\r\n]+;\r