11 namespaceDecl: 'namespace' typeName '{' decl* '}';
\r
14 var: varName (':' type) ('=' expr)?;
\r
15 varInit: varName (':' type) ('=' expr);
\r
17 type: namespaceSpecifier* typeName genericInstantiation? (typeModifier)*;
\r
18 typeModifier: '*' | ('[' (INT_LIT)? ']');
\r
20 namespaceSpecifier: typeName '::';
\r
22 funcDecl: 'func' func;
\r
23 func: funcName genericDecl? '(' parameter ')' (':' type) (body | ';');
\r
24 parameter: (var (',' var)*)?;
\r
26 body: '{' stmt* '}';
\r
29 structDecl: 'struct' structName genericDecl? '{' structMember* '}';
\r
30 structMember: privateDecl? structVar | structMethod;
\r
33 privateDecl: 'private';
\r
35 genericDecl: '<' typeName (',' typeName)* '>';
\r
36 genericInstantiation: '<' type (',' type)* '>';
\r
47 ifStmt: 'if' expr body elseIfStmt* elseStmt?;
\r
48 elseIfStmt: 'else' 'if' expr body;
\r
49 elseStmt: 'else' body;
\r
51 switchStmt: 'switch' expr switchBody;
\r
52 switchBody: '{' switchCase* '}';
\r
53 switchCase: 'case' expr body;
\r
55 forStmt: 'for' varInit ',' expr ',' expr body;
\r
57 whileStmt: 'while' expr body;
\r
59 assignStmt: expr '=' expr;
\r
61 returnStmt: 'return' expr;
\r
63 expr: namespaceSpecifier* funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #funcExpr
\r
64 | expr '.' funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #methodExpr
\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
79 literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT;
\r
90 '+' | '-' | '!' | '~' | '&' | '*' | postfix_op;
\r
92 '+' | '-' | '*' | '/' | '%' | '&' | '<' | '|' | '^' | '>' |
\r
93 '==' | '!=' | '<=' | '>=' | '<' | '>' |
\r
94 '<<' | '>>' | '||' | '&&' | '&=' | '|=' | '^=' |
\r
95 '<<=' | '>>=' | '+=' | '-=' | '*=' | '/=' | '%=';
\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
102 fragment CharSeq: Char+;
\r
103 fragment Char: ~["\\\r\n]
\r
104 | '\\' ['"?abfnrtv\\]
\r
109 NAME: ([a-z] | [A-Z] | [0-9])+;
\r
110 WS: [ \t\r\n]+ -> skip;
\r