var: varName (':' type) ('=' expr)?;\r
varInit: varName (':' type) ('=' expr);\r
\r
-type: namespaceSpecifier* typeName (typeModifier)*;\r
+type: namespaceSpecifier* typeName genericInstantiation? (typeModifier)*;\r
typeModifier: '*' | ('[' (INT_LIT)? ']');\r
\r
namespaceSpecifier: typeName '::';\r
privateDecl: 'private';\r
\r
genericDecl: '<' typeName (',' typeName)* '>';\r
+genericInstantiation: '<' type (',' type)* '>';\r
\r
stmt: varDecl ';'\r
| ifStmt\r
\r
returnStmt: 'return' expr;\r
\r
-expr: namespaceSpecifier* funcName '(' (expr (',' expr)*)? ')' #funcExpr\r
- | expr '.' funcName '(' (expr (',' expr)*)? ')' #methodExpr\r
- | literal #litExpr\r
- | '(' expr ')' #parenExpr\r
- | expr '.' varName #dotExpr\r
- | prefix_op expr #prefixOpExpr\r
- | expr postfix_op #postfixOpExpr\r
- | expr binary_op expr #binaryOpExpr\r
- | expr '?' expr ':' expr #ternaryOpExpr\r
- | expr '[' expr ']' #bracketExpr\r
- | namespaceSpecifier* varName #identifierExpr\r
+expr: namespaceSpecifier* funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #funcExpr\r
+ | expr '.' funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #methodExpr\r
+ | literal #litExpr\r
+ | '(' expr ')' #parenExpr\r
+ | expr (dot | arrow) varName #dotExpr\r
+ | prefix_op expr #prefixOpExpr\r
+ | expr postfix_op #postfixOpExpr\r
+ | expr binary_op expr #binaryOpExpr\r
+ | expr '?' expr ':' expr #ternaryOpExpr\r
+ | expr '[' expr ']' #bracketExpr\r
+ | namespaceSpecifier* varName #identifierExpr\r
;\r
\r
+dot: '.';\r
+arrow: '->';\r
+\r
literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT;\r
\r
funcName: NAME;\r
NAME: ([a-z] | [A-Z] | [0-9])+;\r
WS: [ \t\r\n]+ -> skip;\r
NEWLINE: [\r\n]+;\r
+COMMENT: '//' .*? '\n' -> skip;\r