X-Git-Url: https://gitweb.ps.run/toc/blobdiff_plain/dbc4a22d3c8c4189459f0361cb9da06415ec2dc9..c4231c6faf4e1b4650b075c641b0bb8c053739e4:/Toc.g4 diff --git a/Toc.g4 b/Toc.g4 index 336b7b0..575f7da 100644 --- a/Toc.g4 +++ b/Toc.g4 @@ -14,13 +14,13 @@ 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 '::'; funcDecl: 'func' func; -func: funcName genericDecl? '(' parameter ')' (':' type) body; +func: funcName genericDecl? '(' parameter ')' (':' type) (body | ';'); parameter: (var (',' var)*)?; body: '{' stmt* '}'; @@ -33,6 +33,7 @@ structMethod: func; privateDecl: 'private'; genericDecl: '<' typeName (',' typeName)* '>'; +genericInstantiation: '<' type (',' type)* '>'; stmt: varDecl ';' | ifStmt @@ -59,20 +60,23 @@ 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 ; -literal: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT; +dot: '.'; +arrow: '->'; + +literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT; funcName: NAME; varName: NAME; @@ -92,9 +96,17 @@ binary_op: INT_LIT: ('+' | '-')? [0-9]+; DECIMAL_LIT: ('+' | '-')* [0-9]+ '.' [0-9]+; -STRING_LIT: '"' [^"]* '"'; BOOL_LIT: 'true' | 'false'; +StringLit: '"' CharSeq '"'; + +fragment CharSeq: Char+; +fragment Char: ~["\\\r\n] + | '\\' ['"?abfnrtv\\] + | '\\\n' + | '\\\r\n' + ; -NAME: ([a-z] | [A-Z] | [0-9])+; +NAME: ([a-z] | [A-Z] | '_') ([a-z] | [A-Z] | [0-9] | '_')*; WS: [ \t\r\n]+ -> skip; NEWLINE: [\r\n]+; +COMMENT: '//' .*? '\n' -> skip;