Compare commits

..

1 Commits
master ... lab2

Author SHA1 Message Date
HN 62a95feeb4 update Sysy.g4
3 days ago

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