diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index 263aeef..e4e7a3c 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -1,98 +1,167 @@ -// SysY 子集语法:支持形如 -// int main() { int a = 1; int b = 2; return a + b; } -// 的最小返回表达式编译。 - -// 后续需要自行添加 - +// SysY 扩展语法:支持变量声明、数组、控制流、函数调用及浮点数扩展 grammar SysY; - /*===-------------------------------------------===*/ /* Lexer rules */ /*===-------------------------------------------===*/ - +// 关键字 +CONST: 'const'; INT: 'int'; +FLOAT: 'float'; +VOID: 'void'; +IF: 'if'; +ELSE: 'else'; +WHILE: 'while'; +BREAK: 'break'; +CONTINUE: 'continue'; RETURN: 'return'; - +// 运算符 ASSIGN: '='; ADD: '+'; - +SUB: '-'; +MUL: '*'; +DIV: '/'; +MOD: '%'; +EQ: '=='; +NEQ: '!='; +LT: '<'; +GT: '>'; +LE: '<='; +GE: '>='; +AND: '&&'; +OR: '||'; +NOT: '!'; +// 分隔符 LPAREN: '('; RPAREN: ')'; LBRACE: '{'; RBRACE: '}'; +LBRACK: '['; +RBRACK: ']'; +COMMA: ','; SEMICOLON: ';'; - ID: [a-zA-Z_][a-zA-Z_0-9]*; -ILITERAL: [0-9]+; - -WS: [ \t\r\n] -> skip; +// 整型字面量 +ILITERAL + : [1-9][0-9]* | '0'[0-7]* | ('0x'|'0X')[0-9a-fA-F]+ + ; +// 浮点型字面量 +FLITERAL + : [0-9]+ '.' [0-9]* ([eE] [+-]? [0-9]+)? + | '.' [0-9]+ ([eE] [+-]? [0-9]+)? + | [0-9]+ [eE] [+-]? [0-9]+ + | ('0x'|'0X') [0-9a-fA-F]+ '.' [0-9a-fA-F]* ([pP] [+-]? [0-9]+)? + | ('0x'|'0X') '.' [0-9a-fA-F]+ ([pP] [+-]? [0-9]+)? + | ('0x'|'0X') [0-9a-fA-F]+ [pP] [+-]? [0-9]+ + ; +WS: [ \t\r\n]+ -> skip; LINECOMMENT: '//' ~[\r\n]* -> skip; BLOCKCOMMENT: '/*' .*? '*/' -> skip; - /*===-------------------------------------------===*/ /* Syntax rules */ /*===-------------------------------------------===*/ - +// 支持多个全局声明或函数定义 compUnit - : funcDef EOF + : (decl | funcDef)+ EOF ; - decl - : btype varDef SEMICOLON + : constDecl + | varDecl + ; +constDecl + : CONST btype constDef (COMMA constDef)* SEMICOLON ; - btype : INT + | FLOAT + ; +constDef + : ID (LBRACK constExp RBRACK)* ASSIGN constInitVal ; - +constInitVal + : constExp + | LBRACE (constInitVal (COMMA constInitVal)*)? RBRACE + ; +varDecl + : btype varDef (COMMA varDef)* SEMICOLON + ; +// 变量定义:支持数组维度声明 varDef - : lValue (ASSIGN initValue)? + : ID (LBRACK constExp RBRACK)* + | ID (LBRACK constExp RBRACK)* ASSIGN initValue ; - +// 初始化:支持大括号数组初始化 initValue : exp + | LBRACE (initValue (COMMA initValue)*)? RBRACE ; - +// 函数定义:增加参数列表支持 funcDef - : funcType ID LPAREN RPAREN blockStmt + : funcType ID LPAREN (funcFParams)? RPAREN blockStmt ; - funcType - : INT + : VOID + | INT + | FLOAT + ; +funcFParams + : funcFParam (COMMA funcFParam)* + ; +funcFParam + : btype ID (LBRACK RBRACK (LBRACK exp RBRACK)*)? ; - blockStmt : LBRACE blockItem* RBRACE ; - blockItem : decl | stmt ; - +// 语句:扩充了控制流和赋值 stmt - : returnStmt + : lValue ASSIGN exp SEMICOLON # assignStmt + | (exp)? SEMICOLON # exprStmt + | blockStmt # blockStmtNode + | IF LPAREN cond RPAREN stmt (ELSE stmt)? # ifStmt + | WHILE LPAREN cond RPAREN stmt # whileStmt + | BREAK SEMICOLON # breakStmt + | CONTINUE SEMICOLON # continueStmt + | returnStmt # retStmtNode ; - returnStmt - : RETURN exp SEMICOLON + : RETURN (exp)? SEMICOLON ; - +// 表达式:自上而下定义优先级 exp - : LPAREN exp RPAREN # parenExp - | var # varExp - | number # numberExp - | exp ADD exp # additiveExp + : LPAREN exp RPAREN # parenExp + | lValue # varExp + | number # numberExp + | ID LPAREN (funcRParams)? RPAREN # callExp + | unaryOp exp # unaryExp + | exp (MUL | DIV | MOD) exp # mulExp + | exp (ADD | SUB) exp # additiveExp + | exp (LT | GT | LE | GE) exp # relExp + | exp (EQ | NEQ) exp # eqExp + | exp AND exp # andExp + | exp OR exp # orExp + ; +cond + : exp + ; +unaryOp + : ADD | SUB | NOT ; - -var - : ID +funcRParams + : exp (COMMA exp)* ; - +constExp + : exp + ; +// 左值:支持数组下标访问 lValue - : ID + : ID (LBRACK exp RBRACK)* ; - +// 数字:合并整型与浮点型 number : ILITERAL - ; + | FLITERAL + ; \ No newline at end of file