11 var: varName (':' type) ('=' expr)?;
\r
12 varInit: varName (':' type) ('=' expr);
\r
14 type: typeName (typeModifier)*;
\r
15 typeModifier: '*' | '[' NUMBER? ']';
\r
18 funcDecl: 'func' func;
\r
19 func: funcName '(' parameter ')' (':' type) body;
\r
20 parameter: (var (',' var)*)?;
\r
22 body: '{' stmt* '}';
\r
25 structDecl: 'struct' structName '{' structMember* '}';
\r
26 structMember: structVar | structMethod;
\r
40 ifStmt: 'if' expr body ('else' 'if' expr body)* ('else' body)?;
\r
42 switchStmt: 'switch' identifierExpr switchBody;
\r
43 switchBody: '{' ('case' expr body)* '}';
\r
45 forStmt: 'for' (varInit | assignStmt) ',' expr ',' expr body;
\r
47 whileStmt: 'while' expr body;
\r
49 assignStmt: identifierExpr '=' expr;
\r
51 returnStmt: 'return' expr;
\r
68 nonAccessExpr: funcExpr
\r
72 funcExpr: funcName '(' (expr (',' expr)*)? ')';
\r
74 opExpr: binaryOp | prefixOp | postfixOp | ternaryOp;
\r
75 binaryOp: nonOpExpr BINARY_OP nonOpExpr (BINARY_OP nonOpExpr)*;
\r
76 prefixOp: PREFIX_OP nonOpExpr;
\r
77 postfixOp: nonOpExpr POSTFIX_OP;
\r
78 ternaryOp: nonOpExpr '?' expr ':' expr;
\r
80 identifierExpr: varName;
\r
82 litExpr: INT_LIT | DECIMAL_LIT | STRING_LIT | BOOL_LIT;
\r
84 accessExpr: nonAccessExpr ((('.' | '->') identifierExpr) | ('[' expr ']'))+;
\r
86 parenExpr: '(' expr ')';
\r
97 [+!~&*-] | POSTFIX_OP;
\r
100 '==' | '!=' | '<=' | '>=' | '<' | '>' |
\r
101 '<<' | '>>' | '||' | '&&' | '&=' | '|=' | '^=' |
\r
102 '<<=' | '>>=' | '+=' | '-=' | '*=' | '/=' | '%=';
\r
104 INT_LIT: ('+' | '-')? [0-9]+;
\r
105 DECIMAL_LIT: ('+' | '-')* [0-9]+ '.' [0-9]+;
\r
106 STRING_LIT: '"' [^"]* '"';
\r
107 BOOL_LIT: 'true' | 'false';
\r
109 NAME: ([a-z] | [A-Z] | [0-9])+;
\r
110 WS: [ \t\r\n]+ -> skip;
\r