X-Git-Url: https://gitweb.ps.run/toc/blobdiff_plain/c2ba7425955ae538e220cec79d9124756d1b4c8b..b9322dfb8efe37f6f88a899269bdf21015f4db9a:/Toc.g4 diff --git a/Toc.g4 b/Toc.g4 index 4309e00..36e96e4 100644 --- a/Toc.g4 +++ b/Toc.g4 @@ -14,7 +14,7 @@ varDecl: 'var' var; var: varName (':' type) ('=' expr)?; varInit: varName (':' type) ('=' expr); -type: namespaceSpecifier* typeName (typeModifier)*; +type: namespaceSpecifier* typeName genericInstantiation? (typeModifier)*; typeModifier: '*' | ('[' (INT_LIT)? ']'); namespaceSpecifier: typeName '::'; @@ -33,6 +33,7 @@ structMethod: func; privateDecl: 'private'; genericDecl: '<' typeName (',' typeName)* '>'; +genericInstantiation: '<' type (',' type)* '>'; stmt: varDecl ';' | ifStmt @@ -59,19 +60,22 @@ assignStmt: expr '=' expr; returnStmt: 'return' expr; -expr: namespaceSpecifier* funcName '(' (expr (',' expr)*)? ')' #funcExpr - | expr '.' funcName '(' (expr (',' expr)*)? ')' #methodExpr - | literal #litExpr - | '(' expr ')' #parenExpr - | expr '.' varName #dotExpr - | prefix_op expr #prefixOpExpr - | expr postfix_op #postfixOpExpr - | expr binary_op expr #binaryOpExpr - | expr '?' expr ':' expr #ternaryOpExpr - | expr '[' expr ']' #bracketExpr - | namespaceSpecifier* varName #identifierExpr +expr: namespaceSpecifier* funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #funcExpr + | expr '.' funcName genericInstantiation? '(' (expr (',' expr)*)? ')' #methodExpr + | literal #litExpr + | '(' expr ')' #parenExpr + | expr (dot | arrow) varName #dotExpr + | prefix_op expr #prefixOpExpr + | expr postfix_op #postfixOpExpr + | expr binary_op expr #binaryOpExpr + | expr '?' expr ':' expr #ternaryOpExpr + | expr '[' expr ']' #bracketExpr + | namespaceSpecifier* varName #identifierExpr ; +dot: '.'; +arrow: '->'; + literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT; funcName: NAME;