|
|
|
@ -1,65 +1,68 @@
|
|
|
|
|
|
|
|
// SysY 子集语法:支持形如
|
|
|
|
|
|
|
|
// int main() { int a = 1; int b = 2; return a + b; }
|
|
|
|
|
|
|
|
// 的最小返回表达式编译。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 后续需要自行添加
|
|
|
|
|
|
|
|
|
|
|
|
grammar SysY;
|
|
|
|
grammar SysY;
|
|
|
|
|
|
|
|
|
|
|
|
compUnit
|
|
|
|
/*===-------------------------------------------===*/
|
|
|
|
: (funcDef | decl)+ EOF
|
|
|
|
/* Lexer rules */
|
|
|
|
;
|
|
|
|
/*===-------------------------------------------===*/
|
|
|
|
|
|
|
|
|
|
|
|
decl
|
|
|
|
INT: 'int';
|
|
|
|
: constDecl
|
|
|
|
RETURN: 'return';
|
|
|
|
| varDecl
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constDecl
|
|
|
|
ASSIGN: '=';
|
|
|
|
: Const bType constDef (Comma constDef)* Semi
|
|
|
|
ADD: '+';
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bType
|
|
|
|
LPAREN: '(';
|
|
|
|
: Int
|
|
|
|
RPAREN: ')';
|
|
|
|
| Float
|
|
|
|
LBRACE: '{';
|
|
|
|
;
|
|
|
|
RBRACE: '}';
|
|
|
|
|
|
|
|
SEMICOLON: ';';
|
|
|
|
|
|
|
|
|
|
|
|
constDef
|
|
|
|
ID: [a-zA-Z_][a-zA-Z_0-9]*;
|
|
|
|
: Ident (L_BRAKT constExp R_BRAKT)* Assign constInitVal
|
|
|
|
ILITERAL: [0-9]+;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constInitVal
|
|
|
|
WS: [ \t\r\n] -> skip;
|
|
|
|
: constExp
|
|
|
|
LINECOMMENT: '//' ~[\r\n]* -> skip;
|
|
|
|
| L_BRACE (constInitVal (Comma constInitVal)*)? R_BRACE
|
|
|
|
BLOCKCOMMENT: '/*' .*? '*/' -> skip;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*===-------------------------------------------===*/
|
|
|
|
|
|
|
|
/* Syntax rules */
|
|
|
|
|
|
|
|
/*===-------------------------------------------===*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
compUnit
|
|
|
|
|
|
|
|
: funcDef EOF
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
varDecl
|
|
|
|
decl
|
|
|
|
: bType varDef (Comma varDef)* Semi
|
|
|
|
: btype varDef SEMICOLON
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
funcDef
|
|
|
|
btype
|
|
|
|
: funcType Ident L_PAREN (funcFParams)? R_PAREN block
|
|
|
|
: INT
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
varDef
|
|
|
|
varDef
|
|
|
|
: Ident (L_BRAKT constExp R_BRAKT)* (Assign initVal)?
|
|
|
|
: lValue (ASSIGN initValue)?
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
initVal
|
|
|
|
initValue
|
|
|
|
: exp
|
|
|
|
: exp
|
|
|
|
| L_BRACE (initVal (Comma initVal)*)? R_BRACE
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
funcType
|
|
|
|
|
|
|
|
: Void
|
|
|
|
|
|
|
|
| Int
|
|
|
|
|
|
|
|
| Float
|
|
|
|
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
funcFParams
|
|
|
|
funcDef
|
|
|
|
: funcFParam (Comma funcFParam)*
|
|
|
|
: funcType ID LPAREN RPAREN blockStmt
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
funcFParam
|
|
|
|
funcType
|
|
|
|
: bType Ident (L_BRAKT R_BRAKT (L_BRAKT exp R_BRAKT)*)?
|
|
|
|
: INT
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
block
|
|
|
|
blockStmt
|
|
|
|
: L_BRACE (blockItem)* R_BRACE
|
|
|
|
: LBRACE blockItem* RBRACE
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
blockItem
|
|
|
|
blockItem
|
|
|
|
@ -68,182 +71,28 @@ blockItem
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
stmt
|
|
|
|
stmt
|
|
|
|
: lVar Assign exp Semi
|
|
|
|
: returnStmt
|
|
|
|
| (exp)? Semi
|
|
|
|
|
|
|
|
| block
|
|
|
|
|
|
|
|
| If L_PAREN cond R_PAREN stmt (Else stmt)?
|
|
|
|
|
|
|
|
| While L_PAREN cond R_PAREN stmt
|
|
|
|
|
|
|
|
| Break Semi
|
|
|
|
|
|
|
|
| Continue Semi
|
|
|
|
|
|
|
|
| Return (exp)? Semi
|
|
|
|
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
exp
|
|
|
|
returnStmt
|
|
|
|
: addExp
|
|
|
|
: RETURN exp SEMICOLON
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
cond
|
|
|
|
exp
|
|
|
|
: lOrExp
|
|
|
|
: LPAREN exp RPAREN # parenExp
|
|
|
|
|
|
|
|
| var # varExp
|
|
|
|
|
|
|
|
| number # numberExp
|
|
|
|
|
|
|
|
| exp ADD exp # additiveExp
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
lVar
|
|
|
|
var
|
|
|
|
: Ident (L_BRAKT exp R_BRAKT)*
|
|
|
|
: ID
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
primaryExp
|
|
|
|
lValue
|
|
|
|
: L_PAREN exp R_PAREN
|
|
|
|
: ID
|
|
|
|
| lVar
|
|
|
|
|
|
|
|
| number
|
|
|
|
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
number
|
|
|
|
number
|
|
|
|
: IntConst
|
|
|
|
: ILITERAL
|
|
|
|
| FloatConst
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unaryExp
|
|
|
|
|
|
|
|
: primaryExp
|
|
|
|
|
|
|
|
| Ident L_PAREN (funcRParams)? R_PAREN
|
|
|
|
|
|
|
|
| unaryOp unaryExp
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unaryOp : AddOp | '!';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
funcRParams
|
|
|
|
|
|
|
|
: exp (Comma exp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mulExp
|
|
|
|
|
|
|
|
: unaryExp (MulOp unaryExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addExp
|
|
|
|
|
|
|
|
: mulExp (AddOp mulExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
relExp
|
|
|
|
|
|
|
|
: addExp (RelOp addExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
eqExp
|
|
|
|
|
|
|
|
: relExp (EqOp relExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lAndExp
|
|
|
|
|
|
|
|
: eqExp ('&&' eqExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lOrExp
|
|
|
|
|
|
|
|
: lAndExp ('||' lAndExp)*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constExp
|
|
|
|
|
|
|
|
: addExp
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Void : 'void';
|
|
|
|
|
|
|
|
Int : 'int';
|
|
|
|
|
|
|
|
Float : 'float';
|
|
|
|
|
|
|
|
Const : 'const';
|
|
|
|
|
|
|
|
If : 'if';
|
|
|
|
|
|
|
|
Else : 'else';
|
|
|
|
|
|
|
|
While : 'while';
|
|
|
|
|
|
|
|
Break : 'break';
|
|
|
|
|
|
|
|
Continue: 'continue';
|
|
|
|
|
|
|
|
Return : 'return';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Comma : ',';
|
|
|
|
|
|
|
|
Semi : ';';
|
|
|
|
|
|
|
|
L_PAREN : '(';
|
|
|
|
|
|
|
|
R_PAREN : ')';
|
|
|
|
|
|
|
|
L_BRAKT : '[';
|
|
|
|
|
|
|
|
R_BRAKT : ']';
|
|
|
|
|
|
|
|
L_BRACE : '{';
|
|
|
|
|
|
|
|
R_BRACE : '}';
|
|
|
|
|
|
|
|
Assign : '=';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MulOp : '*' | '/' | '%';
|
|
|
|
|
|
|
|
AddOp : '+' | '-';
|
|
|
|
|
|
|
|
RelOp : '<' | '>' | '<=' | '>=';
|
|
|
|
|
|
|
|
EqOp : '==' | '!=';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ident
|
|
|
|
|
|
|
|
: [a-zA-Z_][a-zA-Z_0-9]*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IntConst
|
|
|
|
|
|
|
|
: DecInt
|
|
|
|
|
|
|
|
| OctInt
|
|
|
|
|
|
|
|
| HexInt
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment DecInt
|
|
|
|
|
|
|
|
: NonZeroD Digit*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment OctInt
|
|
|
|
|
|
|
|
: '0' OctDigit*
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment HexInt
|
|
|
|
|
|
|
|
: HexPre HexDigit+
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FloatConst
|
|
|
|
|
|
|
|
: DecFloat
|
|
|
|
|
|
|
|
| HexFloat
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment DecFloat
|
|
|
|
|
|
|
|
: Fraction Exponent?
|
|
|
|
|
|
|
|
| DiSeq Exponent
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment HexFloat
|
|
|
|
|
|
|
|
: HexPre (HexFraction | HexDiSeq) BiExponent
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment Fraction
|
|
|
|
|
|
|
|
: DiSeq? '.' DiSeq
|
|
|
|
|
|
|
|
| DiSeq '.'
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment Exponent
|
|
|
|
|
|
|
|
: [eE] ('+' | '-')? DiSeq
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment DiSeq
|
|
|
|
|
|
|
|
: Digit+
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment HexFraction
|
|
|
|
|
|
|
|
: HexDiSeq? '.' HexDiSeq
|
|
|
|
|
|
|
|
| HexDiSeq '.'
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment BiExponent
|
|
|
|
|
|
|
|
: [pP] ('+' | '-')? DiSeq
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment HexDiSeq
|
|
|
|
|
|
|
|
: HexDigit+
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment NonZeroD: [1-9];
|
|
|
|
|
|
|
|
fragment Digit : [0-9];
|
|
|
|
|
|
|
|
fragment OctDigit: [0-7];
|
|
|
|
|
|
|
|
fragment HexPre : '0' [xX];
|
|
|
|
|
|
|
|
fragment HexDigit: [0-9A-Fa-f];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WS
|
|
|
|
|
|
|
|
: [ \t\r\n]+ -> skip
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COMMENT
|
|
|
|
|
|
|
|
: '//' ~[\r\n]* -> skip
|
|
|
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BLOCK_COMMENT
|
|
|
|
|
|
|
|
: '/*' .*? '*/' -> skip
|
|
|
|
|
|
|
|
;
|
|
|
|
;
|
|
|
|
|