]> gitweb.ps.run Git - toc/blob - Toc.g4
pre change
[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     | namespaceDecl\r
9     ;\r
10 \r
11 namespaceDecl: 'namespace' typeName '{' decl* '}';\r
12 \r
13 varDecl:  'var' var;\r
14 var:  varName (':' type) ('=' expr)?;\r
15 varInit:  varName (':' type) ('=' expr);\r
16 \r
17 type: namespaceSpecifier* typeName (typeModifier)*;\r
18 typeModifier: '*' | ('[' (INT_LIT)? ']');\r
19 \r
20 namespaceSpecifier: typeName '::';\r
21 \r
22 funcDecl: 'func' func;\r
23 func: funcName genericDecl? '(' parameter ')' (':' type) body;\r
24 parameter: (var (',' var)*)?;\r
25 \r
26 body: '{' stmt* '}';\r
27 \r
28 \r
29 structDecl: 'struct' structName genericDecl? '{' structMember* '}';\r
30 structMember: privateDecl? structVar | structMethod;\r
31 structVar: var ';';\r
32 structMethod: func;\r
33 privateDecl: 'private';\r
34 \r
35 genericDecl: '<' typeName (',' typeName)* '>';\r
36 \r
37 stmt: varDecl ';'\r
38     | ifStmt\r
39     | switchStmt\r
40     | forStmt\r
41     | whileStmt\r
42     | assignStmt ';'\r
43     | returnStmt ';'\r
44     | expr ';';\r
45 \r
46 ifStmt: 'if' expr body elseIfStmt* elseStmt?;\r
47 elseIfStmt: 'else' 'if' expr body;\r
48 elseStmt: 'else' body;\r
49 \r
50 switchStmt: 'switch' expr switchBody;\r
51 switchBody: '{' switchCase* '}';\r
52 switchCase: 'case' expr body;\r
53 \r
54 forStmt: 'for' varInit ',' expr ',' expr body;\r
55 \r
56 whileStmt: 'while' expr body;\r
57 \r
58 assignStmt: expr '=' expr;\r
59 \r
60 returnStmt: 'return' expr;\r
61 \r
62 expr: namespaceSpecifier* funcName '(' (expr (',' expr)*)? ')' #funcExpr\r
63     | expr '.' funcName '(' (expr (',' expr)*)? ')'            #methodExpr\r
64     | literal                                                  #litExpr\r
65     | '(' expr ')'                                             #parenExpr\r
66     | expr '.' varName                                         #dotExpr\r
67     | prefix_op expr                                           #prefixOpExpr\r
68     | expr postfix_op                                          #postfixOpExpr\r
69     | expr binary_op expr                                      #binaryOpExpr\r
70     | expr '?' expr ':' expr                                   #ternaryOpExpr\r
71     | expr '[' expr ']'                                        #bracketExpr\r
72     | namespaceSpecifier* varName                              #identifierExpr\r
73     ;\r
74 \r
75 literal: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;\r
76 \r
77 funcName: NAME;\r
78 varName: NAME;\r
79 typeName: NAME;\r
80 structName: NAME;\r
81 \r
82 \r
83 postfix_op:\r
84     '++' | '--';\r
85 prefix_op:\r
86     '+' | '-' | '!' | '~' | '&' | '*' | postfix_op;\r
87 binary_op:\r
88     '+' | '-' | '*' | '/' | '%' | '&' | '<' | '|' | '^' | '>' |\r
89     '==' | '!=' | '<=' | '>=' | '<'  | '>' |\r
90     '<<' | '>>' | '||' | '&&' | '&=' | '|=' | '^=' |\r
91     '<<=' | '>>=' | '+=' | '-=' | '*=' | '/=' | '%=';\r
92 \r
93 INT_LIT: ('+' | '-')? [0-9]+;\r
94 DECIMAL_LIT: ('+' | '-')* [0-9]+ '.' [0-9]+;\r
95 STRING_LIT: '"' [^"]* '"';\r
96 BOOL_LIT: 'true' | 'false';\r
97 \r
98 NAME: ([a-z] | [A-Z] | [0-9])+;\r
99 WS: [ \t\r\n]+ -> skip;\r
100 NEWLINE: [\r\n]+;\r