abouttreesummaryrefslogcommitdiff
path: root/Toc.g4
diff options
context:
space:
mode:
authorPatrick Schönberger2021-08-04 14:51:23 +0200
committerPatrick Schönberger2021-08-04 14:51:23 +0200
commitdbc4a22d3c8c4189459f0361cb9da06415ec2dc9 (patch)
tree7eabe3910c0a6d56b3d7c2b2a082e95a61a71c58 /Toc.g4
parent71a20a4f3d4e5f5278f7d004af710af89dfd7ebc (diff)
downloadtoc-dbc4a22d3c8c4189459f0361cb9da06415ec2dc9.tar.gz
toc-dbc4a22d3c8c4189459f0361cb9da06415ec2dc9.zip
pre change
Diffstat (limited to 'Toc.g4')
-rw-r--r--Toc.g458
1 files changed, 18 insertions, 40 deletions
diff --git a/Toc.g4 b/Toc.g4
index 0f2f613..336b7b0 100644
--- a/Toc.g4
+++ b/Toc.g4
@@ -14,9 +14,10 @@ varDecl: 'var' var;
var: varName (':' type) ('=' expr)?;
varInit: varName (':' type) ('=' expr);
-type: typeName (typeModifier)*;
+type: namespaceSpecifier* typeName (typeModifier)*;
typeModifier: '*' | ('[' (INT_LIT)? ']');
+namespaceSpecifier: typeName '::';
funcDecl: 'func' func;
func: funcName genericDecl? '(' parameter ')' (':' type) body;
@@ -46,55 +47,32 @@ ifStmt: 'if' expr body elseIfStmt* elseStmt?;
elseIfStmt: 'else' 'if' expr body;
elseStmt: 'else' body;
-switchStmt: 'switch' identifierExpr switchBody;
+switchStmt: 'switch' expr switchBody;
switchBody: '{' switchCase* '}';
switchCase: 'case' expr body;
-forStmt: 'for' (varInit | assignStmt) ',' expr ',' expr body;
+forStmt: 'for' varInit ',' expr ',' expr body;
whileStmt: 'while' expr body;
-assignStmt: identifierExpr '=' expr;
+assignStmt: expr '=' expr;
returnStmt: 'return' expr;
-expr: funcExpr
- | litExpr
- | identifierExpr
- | parenExpr
- | accessExpr
- | opExpr;
-
-/* op */
-nonOpExpr: funcExpr
- | litExpr
- | identifierExpr
- | parenExpr
- | accessExpr;
-
-/* lit access op */
-nonAccessExpr: funcExpr
- | identifierExpr
- | parenExpr;
-
-funcExpr: funcName '(' (expr (',' expr)*)? ')';
-
-opExpr: binaryOp | prefixOp | postfixOp | ternaryOp;
-binaryOp: nonOpExpr binary_op nonOpExpr (binary_op nonOpExpr)*;
-prefixOp: prefix_op nonOpExpr;
-postfixOp: nonOpExpr postfix_op;
-ternaryOp: nonOpExpr '?' expr ':' expr;
-
-identifierExpr: varName;
-
-litExpr: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;
-
-accessExpr: nonAccessExpr (accessSubExpr)+;
-accessSubExpr: accessMember | accessBrackets;
-accessMember: ('.' | '->') identifierExpr;
-accessBrackets: '[' 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
+ ;
-parenExpr: '(' expr ')';
+literal: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;
funcName: NAME;
varName: NAME;