]> gitweb.ps.run Git - toc/blob - Toc.g4
add antlr source code and ReadMe
[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 genericInstantiation? (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 genericInstantiation: '<' type (',' type)* '>';\r
37 \r
38 stmt: varDecl ';'\r
39     | ifStmt\r
40     | switchStmt\r
41     | forStmt\r
42     | whileStmt\r
43     | assignStmt ';'\r
44     | returnStmt ';'\r
45     | expr ';';\r
46 \r
47 ifStmt: 'if' expr body elseIfStmt* elseStmt?;\r
48 elseIfStmt: 'else' 'if' expr body;\r
49 elseStmt: 'else' body;\r
50 \r
51 switchStmt: 'switch' expr switchBody;\r
52 switchBody: '{' switchCase* '}';\r
53 switchCase: 'case' expr body;\r
54 \r
55 forStmt: 'for' varInit ',' expr ',' expr body;\r
56 \r
57 whileStmt: 'while' expr body;\r
58 \r
59 assignStmt: expr '=' expr;\r
60 \r
61 returnStmt: 'return' expr;\r
62 \r
63 expr: namespaceSpecifier* funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #funcExpr\r
64     | expr '.' funcName genericInstantiation? '(' (expr (',' expr)*)? ')'            #methodExpr\r
65     | literal                          #litExpr\r
66     | '(' expr ')'                     #parenExpr\r
67     | expr (dot | arrow) varName       #dotExpr\r
68     | prefix_op expr                   #prefixOpExpr\r
69     | expr postfix_op                  #postfixOpExpr\r
70     | expr binary_op expr              #binaryOpExpr\r
71     | expr '?' expr ':' expr           #ternaryOpExpr\r
72     | expr '[' expr ']'                #bracketExpr\r
73     | namespaceSpecifier* varName      #identifierExpr\r
74     ;\r
75 \r
76 dot: '.';\r
77 arrow: '->';\r
78 \r
79 literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT;\r
80 \r
81 funcName: NAME;\r
82 varName: NAME;\r
83 typeName: NAME;\r
84 structName: NAME;\r
85 \r
86 \r
87 postfix_op:\r
88     '++' | '--';\r
89 prefix_op:\r
90     '+' | '-' | '!' | '~' | '&' | '*' | postfix_op;\r
91 binary_op:\r
92     '+' | '-' | '*' | '/' | '%' | '&' | '<' | '|' | '^' | '>' |\r
93     '==' | '!=' | '<=' | '>=' | '<'  | '>' |\r
94     '<<' | '>>' | '||' | '&&' | '&=' | '|=' | '^=' |\r
95     '<<=' | '>>=' | '+=' | '-=' | '*=' | '/=' | '%=';\r
96 \r
97 INT_LIT: ('+' | '-')? [0-9]+;\r
98 DECIMAL_LIT: ('+' | '-')* [0-9]+ '.' [0-9]+;\r
99 BOOL_LIT: 'true' | 'false';\r
100 StringLit: '"' CharSeq '"';\r
101 \r
102 fragment CharSeq: Char+;\r
103 fragment Char: ~["\\\r\n]\r
104              | '\\' ['"?abfnrtv\\]\r
105              | '\\\n'\r
106              | '\\\r\n'\r
107              ;\r
108 \r
109 NAME: ([a-z] | [A-Z] | '_') ([a-z] | [A-Z] | [0-9] | '_')*;\r
110 WS: [ \t\r\n]+ -> skip;\r
111 NEWLINE: [\r\n]+;\r
112 COMMENT: '//' .*? '\n' -> skip;\r