]> gitweb.ps.run Git - toc/blobdiff - Toc.g4
add comments, fix struct/function lookup
[toc] / Toc.g4
diff --git a/Toc.g4 b/Toc.g4
index 95c9a0dd95a4f35f1fdf9456a7c483b3fbb0712e..a5d5dd83f7d4d94f7cf98438e5cae71fd05f3b43 100644 (file)
--- a/Toc.g4
+++ b/Toc.g4
@@ -2,83 +2,81 @@ grammar Toc;
 \r
 prog: (decl)+ EOF;\r
 \r
-decl: varDecl\r
+decl: varDecl ';'\r
     | funcDecl\r
     | structDecl\r
+    | namespaceDecl\r
     ;\r
 \r
+namespaceDecl: 'namespace' typeName '{' decl* '}';\r
+\r
 varDecl:  'var' var;\r
 var:  varName (':' type) ('=' expr)?;\r
+varInit:  varName (':' type) ('=' expr);\r
 \r
-type: typeName;\r
+type: namespaceSpecifier* typeName genericInstantiation? (typeModifier)*;\r
+typeModifier: '*' | ('[' (INT_LIT)? ']');\r
 \r
+namespaceSpecifier: typeName '::';\r
 \r
 funcDecl: 'func' func;\r
-func: funcName '(' parameter ')' (':' type) body;\r
-parameter: (firstParameter (additionalParameter)*)?;\r
-firstParameter: var;\r
-additionalParameter: ',' var;\r
+func: funcName genericDecl? '(' parameter ')' (':' type) (body | ';');\r
+parameter: (var (',' var)*)?;\r
 \r
 body: '{' stmt* '}';\r
 \r
 \r
-structDecl: 'struct' structName '{' structMember* '}';\r
-structMember: structVar | structMethod;\r
-structVar: var;\r
+structDecl: 'struct' structName genericDecl? '{' structMember* '}';\r
+structMember: privateDecl? structVar | structMethod;\r
+structVar: var ';';\r
 structMethod: func;\r
+privateDecl: 'private';\r
 \r
+genericDecl: '<' typeName (',' typeName)* '>';\r
+genericInstantiation: '<' type (',' type)* '>';\r
 \r
-stmt: (varDecl\r
-     | conditional\r
-     | loop\r
-     | assignment\r
-     | returnStmt\r
-     | expr) ;\r
-\r
-conditional: ifCond;\r
-ifCond: 'if' expr body;\r
-\r
-loop: whileLoop;\r
-whileLoop: 'while' expr body;\r
-\r
-assignment: identifier '=' expr;\r
-\r
-returnStmt: 'return' expr;\r
-\r
-expr: funcCall\r
-    | literal\r
-    | identifier\r
-    | subscript\r
-    | memberAccess\r
-    | parenExpr\r
-    | operatorExpr;\r
+stmt: varDecl ';'\r
+    | ifStmt\r
+    | switchStmt\r
+    | forStmt\r
+    | whileStmt\r
+    | assignStmt ';'\r
+    | returnStmt ';'\r
+    | expr ';';\r
 \r
-nonOpExpr: funcCall\r
-         | literal\r
-         | identifier\r
-         | subscript\r
-         | memberAccess\r
-         | parenExpr;\r
+ifStmt: 'if' expr body elseIfStmt* elseStmt?;\r
+elseIfStmt: 'else' 'if' expr body;\r
+elseStmt: 'else' body;\r
 \r
-nonSubscriptExpr: funcCall\r
-                | identifier\r
-                | memberAccess\r
-                | parenExpr;\r
+switchStmt: 'switch' expr switchBody;\r
+switchBody: '{' switchCase* '}';\r
+switchCase: 'case' expr body;\r
 \r
-funcCall: funcName '(' (expr (',' expr)*)? ')';\r
+forStmt: 'for' varInit ',' expr ',' expr body;\r
 \r
-operatorExpr: binaryOperator;\r
-binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*;\r
+whileStmt: 'while' expr body;\r
 \r
-identifier: varName;\r
+assignStmt: expr '=' expr;\r
 \r
-literal: INTLIT;\r
+returnStmt: 'return' expr;\r
 \r
-subscript: nonSubscriptExpr '[' expr ']';\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
-memberAccess: identifier '.' identifier;\r
+dot: '.';\r
+arrow: '->';\r
 \r
-parenExpr: '(' expr ')';\r
+literal: INT_LIT | DECIMAL_LIT | StringLit | BOOL_LIT;\r
 \r
 funcName: NAME;\r
 varName: NAME;\r
@@ -86,11 +84,29 @@ typeName: NAME;
 structName: NAME;\r
 \r
 \r
-BINARY_OPERATOR:\r
-    '+'  | '-'  | '*' | '/'\r
-  | '==' | '!='\r
-  | '<'  | '>';\r
-INTLIT: ('+' | '-')? [0-9]+;\r
+postfix_op:\r
+    '++' | '--';\r
+prefix_op:\r
+    '+' | '-' | '!' | '~' | '&' | '*' | postfix_op;\r
+binary_op:\r
+    '+' | '-' | '*' | '/' | '%' | '&' | '<' | '|' | '^' | '>' |\r
+    '==' | '!=' | '<=' | '>=' | '<'  | '>' |\r
+    '<<' | '>>' | '||' | '&&' | '&=' | '|=' | '^=' |\r
+    '<<=' | '>>=' | '+=' | '-=' | '*=' | '/=' | '%=';\r
+\r
+INT_LIT: ('+' | '-')? [0-9]+;\r
+DECIMAL_LIT: ('+' | '-')* [0-9]+ '.' [0-9]+;\r
+BOOL_LIT: 'true' | 'false';\r
+StringLit: '"' CharSeq '"';\r
+\r
+fragment CharSeq: Char+;\r
+fragment Char: ~["\\\r\n]\r
+             | '\\' ['"?abfnrtv\\]\r
+             | '\\\n'\r
+             | '\\\r\n'\r
+             ;\r
+\r
 NAME: ([a-z] | [A-Z] | [0-9])+;\r
 WS: [ \t\r\n]+ -> skip;\r
 NEWLINE: [\r\n]+;\r
+COMMENT: '//' .*? '\n' -> skip;\r