]> gitweb.ps.run Git - toc/blobdiff - Toc.g4
complete grammar
[toc] / Toc.g4
diff --git a/Toc.g4 b/Toc.g4
index 7b9ff972ef37d1974169ccdc45cc5d96c401bf3d..631e2c3d2123e69fa2c124969b43d1c8e48ee9a4 100644 (file)
--- a/Toc.g4
+++ b/Toc.g4
@@ -9,8 +9,10 @@ decl: varDecl
 \r
 varDecl:  'var' var;\r
 var:  varName (':' type) ('=' expr)?;\r
+varInit:  varName (':' type) ('=' expr);\r
 \r
-type: typeName;\r
+type: typeName (typeModifier)*;\r
+typeModifier: '*' | '[' NUMBER? ']';\r
 \r
 \r
 funcDecl: 'func' func;\r
@@ -26,63 +28,60 @@ structVar: var;
 structMethod: func;\r
 \r
 \r
-stmt: (varDecl\r
-     | conditional\r
-     | loop\r
-     | assignment\r
-     | returnStmt\r
-     | expr) ;\r
+stmt: varDecl\r
+    | ifStmt\r
+    | switchStmt\r
+    | forStmt\r
+    | whileStmt\r
+    | assignStmt\r
+    | returnStmt\r
+    | expr;\r
 \r
-conditional: ifCond;\r
-ifCond: 'if' expr body;\r
+ifStmt: 'if' expr body ('else' 'if' expr body)* ('else' body)?;\r
 \r
-loop: whileLoop;\r
-whileLoop: 'while' expr body;\r
+switchStmt: 'switch' identifierExpr switchBody;\r
+switchBody: '{' ('case' expr body)* '}';\r
 \r
-assignment: identifier '=' expr;\r
+forStmt: 'for' (varInit | assignStmt) ',' expr ',' expr body;\r
 \r
-returnStmt: 'return' expr;\r
+whileStmt: 'while' expr body;\r
 \r
-expr: funcCall\r
-    | literal\r
-    | identifier\r
-    | subscript\r
-    | memberAccess\r
-    | parenExpr\r
-    | operatorExpr;\r
+assignStmt: identifierExpr '=' expr;\r
 \r
-nonOpExpr: funcCall\r
-         | literal\r
-         | identifier\r
-         | subscript\r
-         | memberAccess\r
-         | parenExpr;\r
+returnStmt: 'return' expr;\r
 \r
-nonSubscriptExpr: funcCall\r
-                | literal\r
-                | identifier\r
-                | memberAccess\r
-                | parenExpr;\r
+expr: funcExpr\r
+    | litExpr\r
+    | identifierExpr\r
+    | parenExpr\r
+    | accessExpr\r
+    | opExpr;\r
 \r
-nonAccessExpr: funcCall\r
-             | literal\r
-             | identifier\r
-             | subscript\r
-             | parenExpr\r
-             | operatorExpr;\r
+/* op */\r
+nonOpExpr: funcExpr\r
+         | litExpr\r
+         | identifierExpr\r
+         | parenExpr\r
+         | accessExpr;\r
 \r
-funcCall: funcName '(' (expr (',' expr)*)? ')';\r
+/* lit access op */\r
+nonAccessExpr: funcExpr\r
+             | identifierExpr\r
+             | parenExpr;\r
 \r
-operatorExpr: binaryOperator;\r
-binaryOperator: nonOpExpr BINARY_OPERATOR nonOpExpr (BINARY_OPERATOR nonOpExpr)*;\r
+funcExpr: funcName '(' (expr (',' expr)*)? ')';\r
 \r
-identifier: varName;\r
+opExpr: binaryOp | prefixOp | postfixOp | ternaryOp;\r
+binaryOp: nonOpExpr BINARY_OP nonOpExpr (BINARY_OP nonOpExpr)*;\r
+prefixOp: PREFIX_OP nonOpExpr;\r
+postfixOp: nonOpExpr POSTFIX_OP;\r
+ternaryOp: nonOpExpr '?' expr ':' expr;\r
 \r
-literal: INTLIT;\r
+identifierExpr: varName;\r
 \r
-subscript: nonSubscriptExpr '[' expr ']';\r
+litExpr: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;\r
 \r
-memberAccess: identifier '.' identifier;\r
+accessExpr: nonAccessExpr ((('.' | '->') identifierExpr) | ('[' expr ']'))+;\r
 \r
 parenExpr: '(' expr ')';\r
 \r
@@ -92,11 +91,22 @@ 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
+STRING_LIT: '"' [^"]* '"';\r
+BOOL_LIT: 'true' | 'false';\r
+\r
 NAME: ([a-z] | [A-Z] | [0-9])+;\r
 WS: [ \t\r\n]+ -> skip;\r
 NEWLINE: [\r\n]+;\r
+NUMBER: [0-9]+;\r