|
|
// SysY 子集语法
|
|
|
grammar SysY;
|
|
|
|
|
|
//----词法规则(优先级从高到低)----//
|
|
|
//keywords
|
|
|
Void : 'void';
|
|
|
Int : 'int';
|
|
|
Float : 'float';
|
|
|
Const : 'const';
|
|
|
If : 'if';
|
|
|
Else : 'else';
|
|
|
While : 'while';
|
|
|
Break : 'break';
|
|
|
Continue: 'continue';
|
|
|
Return : 'return';
|
|
|
|
|
|
//Two-character operator (long preferred)
|
|
|
LeOp : '<=';
|
|
|
GeOp : '>=';
|
|
|
EqOp : '==';
|
|
|
NeOp : '!=';
|
|
|
AndOp : '&&';
|
|
|
OrOp : '||';
|
|
|
|
|
|
//single character operators
|
|
|
AddOp : '+';
|
|
|
SubOp : '-';
|
|
|
MulOp : '*';
|
|
|
DivOp : '/';
|
|
|
QuoOp : '%';
|
|
|
NotOp : '!';
|
|
|
LOp : '<';
|
|
|
GOp : '>';
|
|
|
Assign : '=';
|
|
|
|
|
|
//Separator
|
|
|
Semi : ';';
|
|
|
Comma : ',';
|
|
|
L_PAREN : '(';
|
|
|
R_PAREN : ')';
|
|
|
L_BRACK : '[';
|
|
|
R_BRACK : ']';
|
|
|
L_BRACE : '{';
|
|
|
R_BRACE : '}';
|
|
|
|
|
|
//const numeric classes
|
|
|
//Number... change
|
|
|
// float first
|
|
|
// 16进制float first
|
|
|
HEX_FLOAT
|
|
|
: '0' [xX](
|
|
|
// 形式1: 0x1.921fb6p+1 (有小数点和指数)
|
|
|
HEX_DIGIT* '.' HEX_DIGIT+ [pP] [+-]? DECIMAL_DIGIT+
|
|
|
| // 形式2: 0x1p+1 (没有小数点,只有指数)
|
|
|
HEX_DIGIT+ [pP] [+-]? DECIMAL_DIGIT+
|
|
|
| // 形式3: 0x.AP-3 (小数点开头)
|
|
|
'.' HEX_DIGIT+ [pP] [+-]? DECIMAL_DIGIT+
|
|
|
)
|
|
|
;
|
|
|
fragment HEX_DIGIT: [0-9a-fA-F];
|
|
|
fragment DECIMAL_DIGIT: [0-9];
|
|
|
|
|
|
// 10进制float
|
|
|
DEC_FLOAT
|
|
|
: [0-9]+ '.' [0-9]* EXP? //1.2/1./1.2e10/...
|
|
|
| '.' [0-9]+ EXP? //.1/.1e2
|
|
|
| [0-9]+ EXP //1e2/1e-2
|
|
|
;
|
|
|
fragment EXP: [eE] [+-]? [0-9]+;
|
|
|
|
|
|
HEX_INT: '0' [xX] [0-9a-fA-F]+; //16进制
|
|
|
OCTAL_INT: '0' [0-7]*; //8进制
|
|
|
DECIMAL_INT: [1-9][0-9]*; //10进制
|
|
|
ZERO: '0'; //单独0
|
|
|
|
|
|
// TODO: 后续完善IR后,移除Number兼容规则
|
|
|
Number
|
|
|
: HEX_FLOAT
|
|
|
| DEC_FLOAT
|
|
|
| HEX_INT
|
|
|
| OCTAL_INT
|
|
|
| DECIMAL_INT
|
|
|
| ZERO
|
|
|
;
|
|
|
|
|
|
// 标识符(放最后)
|
|
|
Ident
|
|
|
: [a-zA-Z_][a-zA-Z_0-9]*
|
|
|
;
|
|
|
|
|
|
// 注释和空白
|
|
|
WS
|
|
|
: [ \t\r\n]+ -> skip
|
|
|
;
|
|
|
|
|
|
COMMENT
|
|
|
: '//' ~[\r\n]* -> skip
|
|
|
;
|
|
|
|
|
|
BLOCK_COMMENT
|
|
|
: '/*' .*? '*/' -> skip
|
|
|
;
|
|
|
|
|
|
//----语法规则----//
|
|
|
compUnit
|
|
|
: (funcDef|decl|program) EOF
|
|
|
;
|
|
|
|
|
|
program
|
|
|
: (decl|funcDef)+
|
|
|
;
|
|
|
|
|
|
decl
|
|
|
: varDecl
|
|
|
| constDecl
|
|
|
;
|
|
|
|
|
|
constDecl
|
|
|
: Const bType constDef (Comma constDef)* Semi
|
|
|
;
|
|
|
|
|
|
bType
|
|
|
: Int
|
|
|
| Float
|
|
|
;
|
|
|
|
|
|
constDef
|
|
|
: Ident (L_BRACK constExp R_BRACK)* Assign constInitVal
|
|
|
;
|
|
|
|
|
|
constInitVal
|
|
|
: constExp
|
|
|
| L_BRACE (constInitVal (Comma constInitVal)*)? R_BRACE
|
|
|
;
|
|
|
|
|
|
varDecl
|
|
|
: bType varDef (Comma varDef)* Semi
|
|
|
| Int Ident (Assign exp)? Semi
|
|
|
;
|
|
|
|
|
|
varDef
|
|
|
: Ident (L_BRACK constExp R_BRACK)* (Assign initVal)?
|
|
|
;
|
|
|
|
|
|
initVal
|
|
|
: exp
|
|
|
| L_BRACE (initVal (Comma initVal)*)? R_BRACE
|
|
|
;
|
|
|
|
|
|
funcDef
|
|
|
: funcType Ident L_PAREN (funcFParams)? R_PAREN block
|
|
|
;
|
|
|
|
|
|
funcType
|
|
|
: Void
|
|
|
| Int
|
|
|
| Float
|
|
|
;
|
|
|
|
|
|
funcFParams
|
|
|
: funcFParam (Comma funcFParam)*
|
|
|
;
|
|
|
|
|
|
funcFParam
|
|
|
: bType Ident (L_BRACK R_BRACK (L_BRACK exp R_BRACK)*)?
|
|
|
;
|
|
|
|
|
|
block
|
|
|
: L_BRACE (blockItem)* R_BRACE
|
|
|
;
|
|
|
|
|
|
blockItem
|
|
|
: decl
|
|
|
| stmt
|
|
|
;
|
|
|
|
|
|
stmt
|
|
|
: lVal Assign exp Semi
|
|
|
| (exp)? Semi
|
|
|
| block
|
|
|
| If L_PAREN cond R_PAREN stmt (Else stmt)?
|
|
|
| While L_PAREN cond R_PAREN stmt
|
|
|
| Break Semi
|
|
|
| Continue Semi
|
|
|
| returnStmt
|
|
|
;
|
|
|
|
|
|
returnStmt
|
|
|
: Return (exp)? Semi
|
|
|
;
|
|
|
|
|
|
exp
|
|
|
: addExp
|
|
|
;
|
|
|
|
|
|
cond
|
|
|
: lOrExp
|
|
|
;
|
|
|
|
|
|
lVal
|
|
|
: Ident (L_BRACK exp R_BRACK)*
|
|
|
;
|
|
|
|
|
|
primary
|
|
|
: L_PAREN exp R_PAREN
|
|
|
| lVal
|
|
|
| Number // 让旧代码能用
|
|
|
| HEX_FLOAT
|
|
|
| DEC_FLOAT
|
|
|
| HEX_INT
|
|
|
| OCTAL_INT
|
|
|
| DECIMAL_INT
|
|
|
| ZERO
|
|
|
| Ident
|
|
|
;
|
|
|
|
|
|
unaryExp
|
|
|
: primary
|
|
|
| Ident L_PAREN (funcRParams)? R_PAREN
|
|
|
| unaryOp unaryExp
|
|
|
;
|
|
|
|
|
|
unaryOp
|
|
|
: AddOp
|
|
|
| SubOp
|
|
|
| NotOp
|
|
|
;
|
|
|
|
|
|
funcRParams
|
|
|
: exp (Comma exp)*
|
|
|
;
|
|
|
|
|
|
mulExp
|
|
|
: unaryExp
|
|
|
| mulExp (MulOp|DivOp|QuoOp) unaryExp
|
|
|
;
|
|
|
|
|
|
addExp
|
|
|
: mulExp
|
|
|
| addExp (AddOp|SubOp) mulExp
|
|
|
| primary (AddOp primary)*
|
|
|
;
|
|
|
|
|
|
relExp
|
|
|
: addExp
|
|
|
| relExp (LOp|GOp|LeOp|GeOp) addExp
|
|
|
;
|
|
|
|
|
|
eqExp
|
|
|
: relExp
|
|
|
| eqExp (EqOp|NeOp) relExp
|
|
|
;
|
|
|
|
|
|
lAndExp
|
|
|
: eqExp
|
|
|
| lAndExp AndOp eqExp
|
|
|
;
|
|
|
|
|
|
lOrExp
|
|
|
: lAndExp
|
|
|
| lOrExp OrOp lAndExp
|
|
|
;
|
|
|
|
|
|
constExp
|
|
|
: addExp
|
|
|
; |