|
|
|
|
@ -47,48 +47,44 @@ MUL: '*';
|
|
|
|
|
DIV: '/';
|
|
|
|
|
MOD: '%';
|
|
|
|
|
NOT: '!';
|
|
|
|
|
SUB: '-';
|
|
|
|
|
MUL: '*';
|
|
|
|
|
DIV: '/';
|
|
|
|
|
MOD: '%';
|
|
|
|
|
EQ: '==';
|
|
|
|
|
NEQ: '!=';
|
|
|
|
|
LT: '<';
|
|
|
|
|
GT: '>';
|
|
|
|
|
LE: '<=';
|
|
|
|
|
GE: '>=';
|
|
|
|
|
NOT: '!';
|
|
|
|
|
AND: '&&';
|
|
|
|
|
OR: '||';
|
|
|
|
|
|
|
|
|
|
LPAREN: '(';
|
|
|
|
|
RPAREN: ')';
|
|
|
|
|
LBRACK: '[';
|
|
|
|
|
RBRACK: ']';
|
|
|
|
|
LBRACK: '[';
|
|
|
|
|
RBRACK: ']';
|
|
|
|
|
LBRACE: '{';
|
|
|
|
|
RBRACE: '}';
|
|
|
|
|
COMMA: ',';
|
|
|
|
|
COMMA: ',';
|
|
|
|
|
SEMICOLON: ';';
|
|
|
|
|
|
|
|
|
|
ID: [a-zA-Z_][a-zA-Z_0-9]*;
|
|
|
|
|
|
|
|
|
|
ILITERAL
|
|
|
|
|
: '0' | [1-9][0-9]* // Decimal
|
|
|
|
|
| '0' [0-7]+ // Octal
|
|
|
|
|
| ('0x' | '0X') [0-9a-fA-F]+ // Hex
|
|
|
|
|
HEX_FLOAT_LITERAL
|
|
|
|
|
: ('0x' | '0X') HEX_DIGIT* '.' HEX_DIGIT+ BINARY_EXPONENT
|
|
|
|
|
| ('0x' | '0X') HEX_DIGIT+ '.' HEX_DIGIT* BINARY_EXPONENT
|
|
|
|
|
| ('0x' | '0X') HEX_DIGIT+ BINARY_EXPONENT
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
DEC_FLOAT_LITERAL
|
|
|
|
|
: DEC_DIGIT+ '.' DEC_DIGIT* DEC_EXPONENT?
|
|
|
|
|
| '.' DEC_DIGIT+ DEC_EXPONENT?
|
|
|
|
|
| DEC_DIGIT+ DEC_EXPONENT
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
HEX_INT_LITERAL
|
|
|
|
|
: ('0x' | '0X') HEX_DIGIT+
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
OCT_INT_LITERAL
|
|
|
|
|
: '0' OCT_DIGIT+
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
FLITERAL
|
|
|
|
|
: ([0-9]* '.' [0-9]+ | [0-9]+ '.') ([eE] [+-]? [0-9]+)?
|
|
|
|
|
| [0-9]+ [eE] [+-]? [0-9]+
|
|
|
|
|
| ('0x'|'0X') ([0-9a-fA-F]* '.' [0-9a-fA-F]+ | [0-9a-fA-F]+ '.') ([pP] [+-]? [0-9]+)?
|
|
|
|
|
| ('0x'|'0X') [0-9a-fA-F]+ [pP] [+-]? [0-9]+
|
|
|
|
|
DEC_INT_LITERAL
|
|
|
|
|
: '0'
|
|
|
|
|
| [1-9] DEC_DIGIT*
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
WS: [ \t\r\n]+ -> skip;
|
|
|
|
|
WS: [ \t\r\n] -> skip;
|
|
|
|
|
LINECOMMENT: '//' ~[\r\n]* -> skip;
|
|
|
|
|
BLOCKCOMMENT: '/*' .*? '*/' -> skip;
|
|
|
|
|
|
|
|
|
|
@ -130,16 +126,7 @@ bType
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
constDef
|
|
|
|
|
: ID (LBRACK constExp RBRACK)* ASSIGN constInitVal
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
constInitVal
|
|
|
|
|
: constExp
|
|
|
|
|
| LBRACE (constInitVal (COMMA constInitVal)*)? RBRACE
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
varDecl
|
|
|
|
|
: btype varDef (COMMA varDef)* SEMICOLON
|
|
|
|
|
: ID constIndex* ASSIGN constInitVal
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
varDef
|
|
|
|
|
@ -157,11 +144,11 @@ constInitVal
|
|
|
|
|
|
|
|
|
|
initVal
|
|
|
|
|
: exp
|
|
|
|
|
| LBRACE (initValue (COMMA initValue)*)? RBRACE
|
|
|
|
|
| LBRACE (initVal (COMMA initVal)*)? RBRACE
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
funcDef
|
|
|
|
|
: funcType ID LPAREN funcFParams? RPAREN blockStmt
|
|
|
|
|
: funcType ID LPAREN funcFParams? RPAREN block
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
funcType
|
|
|
|
|
@ -175,7 +162,7 @@ funcFParams
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
funcFParam
|
|
|
|
|
: btype ID (LBRACK RBRACK (LBRACK exp RBRACK)*)?
|
|
|
|
|
: bType ID (LBRACK RBRACK (LBRACK exp RBRACK)*)?
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
block
|
|
|
|
|
@ -188,53 +175,107 @@ blockItem
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
stmt
|
|
|
|
|
: lValue ASSIGN exp SEMICOLON # assignStmt
|
|
|
|
|
| exp? SEMICOLON # exprStmt
|
|
|
|
|
| blockStmt # blockStmtStmt
|
|
|
|
|
| IF LPAREN cond RPAREN stmt (ELSE stmt)? # ifStmt
|
|
|
|
|
| WHILE LPAREN cond RPAREN stmt # whileStmt
|
|
|
|
|
| BREAK SEMICOLON # breakStmt
|
|
|
|
|
| CONTINUE SEMICOLON # continueStmt
|
|
|
|
|
| RETURN exp? SEMICOLON # returnStmt
|
|
|
|
|
: lVal ASSIGN exp SEMICOLON
|
|
|
|
|
| exp? SEMICOLON
|
|
|
|
|
| block
|
|
|
|
|
| IF LPAREN cond RPAREN stmt (ELSE stmt)?
|
|
|
|
|
| WHILE LPAREN cond RPAREN stmt
|
|
|
|
|
| BREAK SEMICOLON
|
|
|
|
|
| CONTINUE SEMICOLON
|
|
|
|
|
| RETURN exp? SEMICOLON
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
exp
|
|
|
|
|
: LPAREN exp RPAREN # parenExp
|
|
|
|
|
| lValue # lvalExp
|
|
|
|
|
| number # numberExp
|
|
|
|
|
| ID LPAREN funcRParams? RPAREN # callExp
|
|
|
|
|
| unaryOp exp # unaryExp
|
|
|
|
|
| exp (MUL | DIV | MOD) exp # mulExp
|
|
|
|
|
| exp (ADD | SUB) exp # addExp
|
|
|
|
|
| exp (LT | GT | LE | GE) exp # relExp
|
|
|
|
|
| exp (EQ | NEQ) exp # eqExp
|
|
|
|
|
| exp AND exp # lAndExp
|
|
|
|
|
| exp OR exp # lOrExp
|
|
|
|
|
: addExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
cond
|
|
|
|
|
: exp
|
|
|
|
|
: lOrExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
lValue
|
|
|
|
|
lVal
|
|
|
|
|
: ID (LBRACK exp RBRACK)*
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
primaryExp
|
|
|
|
|
: LPAREN exp RPAREN
|
|
|
|
|
| lVal
|
|
|
|
|
| number
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
number
|
|
|
|
|
: ILITERAL # intConst
|
|
|
|
|
| FLITERAL # floatConst
|
|
|
|
|
: intConst
|
|
|
|
|
| floatConst
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
intConst
|
|
|
|
|
: DEC_INT_LITERAL
|
|
|
|
|
| OCT_INT_LITERAL
|
|
|
|
|
| HEX_INT_LITERAL
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
unaryOp
|
|
|
|
|
floatConst
|
|
|
|
|
: DEC_FLOAT_LITERAL
|
|
|
|
|
| HEX_FLOAT_LITERAL
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
unaryExp
|
|
|
|
|
: primaryExp
|
|
|
|
|
| ID LPAREN funcRParams? RPAREN
|
|
|
|
|
| addUnaryOp unaryExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
addUnaryOp
|
|
|
|
|
: ADD
|
|
|
|
|
| SUB
|
|
|
|
|
| NOT
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
funcRParams
|
|
|
|
|
: exp (COMMA exp)*
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
mulExp
|
|
|
|
|
: unaryExp
|
|
|
|
|
| mulExp MUL unaryExp
|
|
|
|
|
| mulExp DIV unaryExp
|
|
|
|
|
| mulExp MOD unaryExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
addExp
|
|
|
|
|
: mulExp
|
|
|
|
|
| addExp ADD mulExp
|
|
|
|
|
| addExp SUB mulExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
relExp
|
|
|
|
|
: addExp
|
|
|
|
|
| relExp LT addExp
|
|
|
|
|
| relExp GT addExp
|
|
|
|
|
| relExp LE addExp
|
|
|
|
|
| relExp GE addExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
eqExp
|
|
|
|
|
: relExp
|
|
|
|
|
| eqExp EQ relExp
|
|
|
|
|
| eqExp NE relExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
lAndExp
|
|
|
|
|
: condUnaryExp
|
|
|
|
|
| lAndExp AND condUnaryExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
lOrExp
|
|
|
|
|
: lAndExp
|
|
|
|
|
| lOrExp OR lAndExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
condUnaryExp
|
|
|
|
|
: eqExp
|
|
|
|
|
| NOT condUnaryExp
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
constExp
|
|
|
|
|
: exp
|
|
|
|
|
: addExp
|
|
|
|
|
;
|
|
|
|
|
|