diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index 4c5d788..262f07a 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -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 ;