var: varName (':' type) ('=' expr)?;\r
varInit: varName (':' type) ('=' expr);\r
\r
-type: typeName (typeModifier)*;\r
+type: namespaceSpecifier* typeName (typeModifier)*;\r
typeModifier: '*' | ('[' (INT_LIT)? ']');\r
\r
+namespaceSpecifier: typeName '::';\r
\r
funcDecl: 'func' func;\r
func: funcName genericDecl? '(' parameter ')' (':' type) body;\r
elseIfStmt: 'else' 'if' expr body;\r
elseStmt: 'else' body;\r
\r
-switchStmt: 'switch' identifierExpr switchBody;\r
+switchStmt: 'switch' expr switchBody;\r
switchBody: '{' switchCase* '}';\r
switchCase: 'case' expr body;\r
\r
-forStmt: 'for' (varInit | assignStmt) ',' expr ',' expr body;\r
+forStmt: 'for' varInit ',' expr ',' expr body;\r
\r
whileStmt: 'while' expr body;\r
\r
-assignStmt: identifierExpr '=' expr;\r
+assignStmt: expr '=' expr;\r
\r
returnStmt: 'return' expr;\r
\r
-expr: funcExpr\r
- | litExpr\r
- | identifierExpr\r
- | parenExpr\r
- | accessExpr\r
- | opExpr;\r
-\r
-/* op */\r
-nonOpExpr: funcExpr\r
- | litExpr\r
- | identifierExpr\r
- | parenExpr\r
- | accessExpr;\r
-\r
-/* lit access op */\r
-nonAccessExpr: funcExpr\r
- | identifierExpr\r
- | parenExpr;\r
-\r
-funcExpr: funcName '(' (expr (',' expr)*)? ')';\r
-\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
-identifierExpr: varName;\r
-\r
-litExpr: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;\r
-\r
-accessExpr: nonAccessExpr (accessSubExpr)+;\r
-accessSubExpr: accessMember | accessBrackets;\r
-accessMember: ('.' | '->') identifierExpr;\r
-accessBrackets: '[' expr ']';\r
+expr: namespaceSpecifier* funcName '(' (expr (',' expr)*)? ')' #funcExpr\r
+ | expr '.' funcName '(' (expr (',' expr)*)? ')' #methodExpr\r
+ | literal #litExpr\r
+ | '(' expr ')' #parenExpr\r
+ | expr '.' 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
-parenExpr: '(' expr ')';\r
+literal: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;\r
\r
funcName: NAME;\r
varName: NAME;\r