From f16c29db264650057906fbbcdec859233b50ccdc Mon Sep 17 00:00:00 2001 From: Shrink <1569629152@qq.com> Date: Fri, 20 Mar 2026 17:42:28 +0800 Subject: [PATCH] feat:complement the rules --- src/antlr4/SysY.g4 | 240 ++++++++++++++++++++++++++------------------- 1 file changed, 138 insertions(+), 102 deletions(-) diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index 38d82a3..ff2b0aa 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -1,11 +1,88 @@ +// SysY Lab1 语法:覆盖常见声明、控制流、数组、函数与表达式优先级。 + grammar SysY; -// ====================== -// Parser Rules -// ====================== +/*===-------------------------------------------===*/ +/* Lexer rules */ +/*===-------------------------------------------===*/ + +CONST: 'const'; +INT: 'int'; +FLOAT: 'float'; +VOID: 'void'; +IF: 'if'; +ELSE: 'else'; +WHILE: 'while'; +BREAK: 'break'; +CONTINUE: 'continue'; +RETURN: 'return'; + +ASSIGN: '='; +EQ: '=='; +NE: '!='; +LT: '<'; +GT: '>'; +LE: '<='; +GE: '>='; + +ADD: '+'; +SUB: '-'; +MUL: '*'; +DIV: '/'; +MOD: '%'; +NOT: '!'; +AND: '&&'; +OR: '||'; + +LPAREN: '('; +RPAREN: ')'; +LBRACK: '['; +RBRACK: ']'; +LBRACE: '{'; +RBRACE: '}'; +COMMA: ','; +SEMICOLON: ';'; + +ID: [a-zA-Z_][a-zA-Z_0-9]*; + +FLITERAL + : DECIMAL_FLOAT + | HEX_FLOAT + ; + +ILITERAL + : HEX_INT + | OCT_INT + | DEC_INT + ; + +fragment DEC_INT: '0' | [1-9] [0-9]*; +fragment OCT_INT: '0' [0-7]+; +fragment HEX_INT: '0' [xX] [0-9a-fA-F]+; + +fragment DECIMAL_FLOAT + : [0-9]+ '.' [0-9]* EXP? + | '.' [0-9]+ EXP? + | [0-9]+ EXP + ; + +fragment HEX_FLOAT + : '0' [xX] [0-9a-fA-F]+ ('.' [0-9a-fA-F]*)? [pP] [+-]? [0-9]+ + | '0' [xX] '.' [0-9a-fA-F]+ [pP] [+-]? [0-9]+ + ; + +fragment EXP: [eE] [+-]? [0-9]+; + +WS: [ \t\r\n] -> skip; +LINECOMMENT: '//' ~[\r\n]* -> skip; +BLOCKCOMMENT: '/*' .*? '*/' -> skip; + +/*===-------------------------------------------===*/ +/* Syntax rules */ +/*===-------------------------------------------===*/ compUnit - : (decl | funcDef)+ + : (decl | funcDef)+ EOF ; decl @@ -14,57 +91,56 @@ decl ; constDecl - : 'const' bType constDef (',' constDef)* ';' - ; - -bType - : 'int' - | 'float' + : CONST btype constDef (COMMA constDef)* SEMICOLON ; constDef - : Ident ('[' constExp ']')* '=' constInitVal + : ID (LBRACK constExp RBRACK)* ASSIGN constInitValue ; -constInitVal +constInitValue : constExp - | '{' (constInitVal (',' constInitVal)*)? '}' + | LBRACE (constInitValue (COMMA constInitValue)*)? RBRACE ; varDecl - : bType varDef (',' varDef)* ';' + : btype varDef (COMMA varDef)* SEMICOLON + ; + +btype + : INT + | FLOAT ; varDef - : Ident ('[' constExp ']')* - | Ident ('[' constExp ']')* '=' initVal + : ID (LBRACK constExp RBRACK)* (ASSIGN initValue)? ; -initVal +initValue : exp - | '{' (initVal (',' initVal)*)? '}' + | LBRACE (initValue (COMMA initValue)*)? RBRACE ; funcDef - : funcType Ident '(' funcFParams? ')' block + : funcType ID LPAREN (funcFParams)? RPAREN blockStmt ; funcType - : 'void' - | 'int' - | 'float' + : INT + | FLOAT + | VOID ; funcFParams - : funcFParam (',' funcFParam)* + : funcFParam (COMMA funcFParam)* ; funcFParam - : bType Ident ('[' ']' ('[' exp ']')*)? + : btype ID (LBRACK RBRACK (LBRACK exp RBRACK)*)? ; -block - : '{' blockItem* '}' +blockStmt + : LBRACE blockItem* RBRACE ; blockItem @@ -73,14 +149,18 @@ blockItem ; stmt - : lVal '=' exp ';' - | exp? ';' - | block - | 'if' '(' cond ')' stmt ('else' stmt)? - | 'while' '(' cond ')' stmt - | 'break' ';' - | 'continue' ';' - | 'return' exp? ';' + : lValue ASSIGN exp SEMICOLON + | (exp)? SEMICOLON + | blockStmt + | IF LPAREN cond RPAREN stmt (ELSE stmt)? + | WHILE LPAREN cond RPAREN stmt + | BREAK SEMICOLON + | CONTINUE SEMICOLON + | returnStmt + ; + +returnStmt + : RETURN (exp)? SEMICOLON ; exp @@ -91,111 +171,67 @@ cond : lOrExp ; -lVal - : Ident ('[' exp ']')* +lValue + : ID (LBRACK exp RBRACK)* ; primaryExp - : '(' exp ')' - | lVal + : LPAREN exp RPAREN + | lValue | number ; number - : FloatConst - | IntConst + : ILITERAL + | FLITERAL ; unaryExp : primaryExp - | Ident '(' funcRParams? ')' + | ID LPAREN (funcRParams)? RPAREN | unaryOp unaryExp ; unaryOp - : '+' - | '-' - | '!' + : ADD + | SUB + | NOT ; funcRParams - : exp (',' exp)* + : exp (COMMA exp)* ; mulExp - : unaryExp (('*' | '/' | '%') unaryExp)* + : unaryExp + | mulExp (MUL | DIV | MOD) unaryExp ; - + addExp - : mulExp (('+' | '-') mulExp)* + : mulExp + | addExp (ADD | SUB) mulExp ; relExp - : addExp (('<' | '>' | '<=' | '>=') addExp)* + : addExp + | relExp (LT | GT | LE | GE) addExp ; eqExp - : relExp (('==' | '!=') relExp)* + : relExp + | eqExp (EQ | NE) relExp ; lAndExp - : eqExp ('&&' eqExp)* + : eqExp + | lAndExp AND eqExp ; lOrExp - : lAndExp ('||' lAndExp)* + : lAndExp + | lOrExp OR lAndExp ; constExp : addExp ; - -// ====================== -// Lexer Rules -// ====================== - -fragment DIGIT : [0-9] ; -fragment HEXDIGIT : [0-9a-fA-F] ; -fragment EXP : [eE][+-]? DIGIT+ ; -fragment PEXP : [pP][+-]? DIGIT+ ; - -// Float(含 hex float) -FloatConst - : ('0x' | '0X') - ( - HEXDIGIT+ '.' HEXDIGIT* - | '.' HEXDIGIT+ - | HEXDIGIT+ - ) - PEXP - | '.' DIGIT+ EXP? - | DIGIT+ '.' DIGIT* EXP? - | DIGIT+ EXP - ; - -// Int(完整三种) -IntConst - : '0' - | [1-9][0-9]* // decimal - | '0'[0-7]+ // octal - | ('0x' | '0X')[0-9a-fA-F]+ // hex - ; - -// ---------- 标识符 ---------- -Ident - : [a-zA-Z_][a-zA-Z0-9_]* - ; - -// ---------- 空白 ---------- -WS - : [ \t\r\n]+ -> skip - ; - -// ---------- 注释 ---------- -LINE_COMMENT - : '//' ~[\r\n]* -> skip - ; - -BLOCK_COMMENT - : '/*' .*? '*/' -> skip - ; \ No newline at end of file