diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index 89ec4e4..5115f15 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -69,6 +69,35 @@ fragment HEX_LITERAL : '0' ('x' | 'X') [0-9a-fA-F]+ ; +// 浮点字面量 +FLITERAL + : (DECIMAL_FLOAT | HEX_FLOAT) + ; + +fragment DECIMAL_FLOAT + : (('+' | '-')? (DIGIT+ '.' DIGIT* | '.' DIGIT+ | DIGIT+) + (('E' | 'e') ('+' | '-')? DIGIT+)?) + | (('+' | '-')? '0' [0-7]+ '.' [0-7]* + (('E' | 'e') ('+' | '-')? DIGIT+)?) + ; + +fragment HEX_FLOAT + : ('+' | '-')? '0' ('x' | 'X') + (HEXDIGIT* '.' HEXDIGIT+ | HEXDIGIT+ '.') + (('P' | 'p') ('+' | '-')? DIGIT+) + | ('+' | '-')? '0' ('x' | 'X') + HEXDIGIT+ + (('P' | 'p') ('+' | '-')? DIGIT+) + ; + +fragment DIGIT + : [0-9] + ; + +fragment HEXDIGIT + : [0-9a-fA-F] + ; + // 空白和注释 WS: [ \t\r\n] -> skip; LINECOMMENT: '//' ~[\r\n]* -> skip; @@ -102,19 +131,20 @@ btype ; constDef - : ID ASSIGN initValue + : ID (LBRACK exp RBRACK)* ASSIGN initValue ; varDef - : ID (ASSIGN initValue)? + : ID (LBRACK exp RBRACK)* (ASSIGN initValue)? ; initValue : exp + | LBRACE (initValue (COMMA initValue)*)? RBRACE ; funcDef - : funcType ID LPAREN RPAREN blockStmt + : funcType ID LPAREN (funcFParams)? RPAREN blockStmt ; funcType @@ -123,6 +153,14 @@ funcType | VOID ; +funcFParams + : funcFParam (COMMA funcFParam)* + ; + +funcFParam + : btype ID (LBRACK (exp)? RBRACK)* + ; + blockStmt : LBRACE blockItem* RBRACE ; @@ -147,9 +185,11 @@ exp ; lValue - : ID + : ID (LBRACK exp RBRACK)* ; number : ILITERAL + | FLITERAL ; +