From 45409c781a9e35df68c43b1e2f028d30bf90c0a0 Mon Sep 17 00:00:00 2001 From: Patrick Schönberger Date: Wed, 28 Jul 2021 09:07:53 +0200 Subject: Initial commit --- Toc.g4 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Toc.g4 (limited to 'Toc.g4') diff --git a/Toc.g4 b/Toc.g4 new file mode 100644 index 0000000..95c9a0d --- /dev/null +++ b/Toc.g4 @@ -0,0 +1,96 @@ +grammar Toc; + +prog: (decl)+ EOF; + +decl: varDecl + | funcDecl + | structDecl + ; + +varDecl: 'var' var; +var: varName (':' type) ('=' expr)?; + +type: typeName; + + +funcDecl: 'func' func; +func: funcName '(' parameter ')' (':' type) body; +parameter: (firstParameter (additionalParameter)*)?; +firstParameter: var; +additionalParameter: ',' var; + +body: '{' stmt* '}'; + + +structDecl: 'struct' structName '{' structMember* '}'; +structMember: structVar | structMethod; +structVar: var; +structMethod: func; + + +stmt: (varDecl + | conditional + | loop + | assignment + | returnStmt + | expr) ; + +conditional: ifCond; +ifCond: 'if' expr body; + +loop: whileLoop; +whileLoop: 'while' expr body; + +assignment: identifier '=' expr; + +returnStmt: 'return' expr; + +expr: funcCall + | literal + | identifier + | subscript + | memberAccess + | parenExpr + | operatorExpr; + +nonOpExpr: funcCall + | literal + | identifier + | subscript + | memberAccess + | parenExpr; + +nonSubscriptExpr: funcCall + | identifier + | memberAccess + | parenExpr; + +funcCall: funcName '(' (expr (',' expr)*)? ')'; + +operatorExpr: binaryOperator; +binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*; + +identifier: varName; + +literal: INTLIT; + +subscript: nonSubscriptExpr '[' expr ']'; + +memberAccess: identifier '.' identifier; + +parenExpr: '(' expr ')'; + +funcName: NAME; +varName: NAME; +typeName: NAME; +structName: NAME; + + +BINARY_OPERATOR: + '+' | '-' | '*' | '/' + | '==' | '!=' + | '<' | '>'; +INTLIT: ('+' | '-')? [0-9]+; +NAME: ([a-z] | [A-Z] | [0-9])+; +WS: [ \t\r\n]+ -> skip; +NEWLINE: [\r\n]+; -- cgit v1.2.3