update Sysy.g4

lab2
HN 1 day ago
parent be143f5326
commit 62a95feeb4

@ -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
;
Loading…
Cancel
Save