]> gitweb.ps.run Git - toc/blob - Toc.g4
Initial commit
[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: (firstParameter (additionalParameter)*)?;\r
19 firstParameter: var;\r
20 additionalParameter: ',' var;\r
21 \r
22 body: '{' stmt* '}';\r
23 \r
24 \r
25 structDecl: 'struct' structName '{' structMember* '}';\r
26 structMember: structVar | structMethod;\r
27 structVar: var;\r
28 structMethod: func;\r
29 \r
30 \r
31 stmt: (varDecl\r
32      | conditional\r
33      | loop\r
34      | assignment\r
35      | returnStmt\r
36      | expr) ;\r
37 \r
38 conditional: ifCond;\r
39 ifCond: 'if' expr body;\r
40 \r
41 loop: whileLoop;\r
42 whileLoop: 'while' expr body;\r
43 \r
44 assignment: identifier '=' expr;\r
45 \r
46 returnStmt: 'return' expr;\r
47 \r
48 expr: funcCall\r
49     | literal\r
50     | identifier\r
51     | subscript\r
52     | memberAccess\r
53     | parenExpr\r
54     | operatorExpr;\r
55 \r
56 nonOpExpr: funcCall\r
57          | literal\r
58          | identifier\r
59          | subscript\r
60          | memberAccess\r
61          | parenExpr;\r
62 \r
63 nonSubscriptExpr: funcCall\r
64                 | identifier\r
65                 | memberAccess\r
66                 | parenExpr;\r
67 \r
68 funcCall: funcName '(' (expr (',' expr)*)? ')';\r
69 \r
70 operatorExpr: binaryOperator;\r
71 binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*;\r
72 \r
73 identifier: varName;\r
74 \r
75 literal: INTLIT;\r
76 \r
77 subscript: nonSubscriptExpr '[' expr ']';\r
78 \r
79 memberAccess: identifier '.' identifier;\r
80 \r
81 parenExpr: '(' expr ')';\r
82 \r
83 funcName: NAME;\r
84 varName: NAME;\r
85 typeName: NAME;\r
86 structName: NAME;\r
87 \r
88 \r
89 BINARY_OPERATOR:\r
90     '+'  | '-'  | '*' | '/'\r
91   | '==' | '!='\r
92   | '<'  | '>';\r
93 INTLIT: ('+' | '-')? [0-9]+;\r
94 NAME: ([a-z] | [A-Z] | [0-9])+;\r
95 WS: [ \t\r\n]+ -> skip;\r
96 NEWLINE: [\r\n]+;\r