feat<src/antlr4/SysY.g4>:complement the rules

Shrink
Shrink 3 weeks ago
parent d6926a7b75
commit f16c29db26

@ -1,11 +1,88 @@
// SysY Lab1 语法:覆盖常见声明、控制流、数组、函数与表达式优先级。
grammar SysY;
// ======================
// Parser Rules
// ======================
/*===-------------------------------------------===*/
/* Lexer rules */
/*===-------------------------------------------===*/
CONST: 'const';
INT: 'int';
FLOAT: 'float';
VOID: 'void';
IF: 'if';
ELSE: 'else';
WHILE: 'while';
BREAK: 'break';
CONTINUE: 'continue';
RETURN: 'return';
ASSIGN: '=';
EQ: '==';
NE: '!=';
LT: '<';
GT: '>';
LE: '<=';
GE: '>=';
ADD: '+';
SUB: '-';
MUL: '*';
DIV: '/';
MOD: '%';
NOT: '!';
AND: '&&';
OR: '||';
LPAREN: '(';
RPAREN: ')';
LBRACK: '[';
RBRACK: ']';
LBRACE: '{';
RBRACE: '}';
COMMA: ',';
SEMICOLON: ';';
ID: [a-zA-Z_][a-zA-Z_0-9]*;
FLITERAL
: DECIMAL_FLOAT
| HEX_FLOAT
;
ILITERAL
: HEX_INT
| OCT_INT
| DEC_INT
;
fragment DEC_INT: '0' | [1-9] [0-9]*;
fragment OCT_INT: '0' [0-7]+;
fragment HEX_INT: '0' [xX] [0-9a-fA-F]+;
fragment DECIMAL_FLOAT
: [0-9]+ '.' [0-9]* EXP?
| '.' [0-9]+ EXP?
| [0-9]+ EXP
;
fragment HEX_FLOAT
: '0' [xX] [0-9a-fA-F]+ ('.' [0-9a-fA-F]*)? [pP] [+-]? [0-9]+
| '0' [xX] '.' [0-9a-fA-F]+ [pP] [+-]? [0-9]+
;
fragment EXP: [eE] [+-]? [0-9]+;
WS: [ \t\r\n] -> skip;
LINECOMMENT: '//' ~[\r\n]* -> skip;
BLOCKCOMMENT: '/*' .*? '*/' -> skip;
/*===-------------------------------------------===*/
/* Syntax rules */
/*===-------------------------------------------===*/
compUnit
: (decl | funcDef)+
: (decl | funcDef)+ EOF
;
decl
@ -14,57 +91,56 @@ decl
;
constDecl
: 'const' bType constDef (',' constDef)* ';'
;
bType
: 'int'
| 'float'
: CONST btype constDef (COMMA constDef)* SEMICOLON
;
constDef
: Ident ('[' constExp ']')* '=' constInitVal
: ID (LBRACK constExp RBRACK)* ASSIGN constInitValue
;
constInitVal
constInitValue
: constExp
| '{' (constInitVal (',' constInitVal)*)? '}'
| LBRACE (constInitValue (COMMA constInitValue)*)? RBRACE
;
varDecl
: bType varDef (',' varDef)* ';'
: btype varDef (COMMA varDef)* SEMICOLON
;
btype
: INT
| FLOAT
;
varDef
: Ident ('[' constExp ']')*
| Ident ('[' constExp ']')* '=' initVal
: ID (LBRACK constExp RBRACK)* (ASSIGN initValue)?
;
initVal
initValue
: exp
| '{' (initVal (',' initVal)*)? '}'
| LBRACE (initValue (COMMA initValue)*)? RBRACE
;
funcDef
: funcType Ident '(' funcFParams? ')' block
: funcType ID LPAREN (funcFParams)? RPAREN blockStmt
;
funcType
: 'void'
| 'int'
| 'float'
: INT
| FLOAT
| VOID
;
funcFParams
: funcFParam (',' funcFParam)*
: funcFParam (COMMA funcFParam)*
;
funcFParam
: bType Ident ('[' ']' ('[' exp ']')*)?
: btype ID (LBRACK RBRACK (LBRACK exp RBRACK)*)?
;
block
: '{' blockItem* '}'
blockStmt
: LBRACE blockItem* RBRACE
;
blockItem
@ -73,14 +149,18 @@ blockItem
;
stmt
: lVal '=' exp ';'
| exp? ';'
| block
| 'if' '(' cond ')' stmt ('else' stmt)?
| 'while' '(' cond ')' stmt
| 'break' ';'
| 'continue' ';'
| 'return' exp? ';'
: lValue ASSIGN exp SEMICOLON
| (exp)? SEMICOLON
| blockStmt
| IF LPAREN cond RPAREN stmt (ELSE stmt)?
| WHILE LPAREN cond RPAREN stmt
| BREAK SEMICOLON
| CONTINUE SEMICOLON
| returnStmt
;
returnStmt
: RETURN (exp)? SEMICOLON
;
exp
@ -91,111 +171,67 @@ cond
: lOrExp
;
lVal
: Ident ('[' exp ']')*
lValue
: ID (LBRACK exp RBRACK)*
;
primaryExp
: '(' exp ')'
| lVal
: LPAREN exp RPAREN
| lValue
| number
;
number
: FloatConst
| IntConst
: ILITERAL
| FLITERAL
;
unaryExp
: primaryExp
| Ident '(' funcRParams? ')'
| ID LPAREN (funcRParams)? RPAREN
| unaryOp unaryExp
;
unaryOp
: '+'
| '-'
| '!'
: ADD
| SUB
| NOT
;
funcRParams
: exp (',' exp)*
: exp (COMMA exp)*
;
mulExp
: unaryExp (('*' | '/' | '%') unaryExp)*
: unaryExp
| mulExp (MUL | DIV | MOD) unaryExp
;
addExp
: mulExp (('+' | '-') mulExp)*
: mulExp
| addExp (ADD | SUB) mulExp
;
relExp
: addExp (('<' | '>' | '<=' | '>=') addExp)*
: addExp
| relExp (LT | GT | LE | GE) addExp
;
eqExp
: relExp (('==' | '!=') relExp)*
: relExp
| eqExp (EQ | NE) relExp
;
lAndExp
: eqExp ('&&' eqExp)*
: eqExp
| lAndExp AND eqExp
;
lOrExp
: lAndExp ('||' lAndExp)*
: lAndExp
| lOrExp OR lAndExp
;
constExp
: addExp
;
// ======================
// Lexer Rules
// ======================
fragment DIGIT : [0-9] ;
fragment HEXDIGIT : [0-9a-fA-F] ;
fragment EXP : [eE][+-]? DIGIT+ ;
fragment PEXP : [pP][+-]? DIGIT+ ;
// Float含 hex float
FloatConst
: ('0x' | '0X')
(
HEXDIGIT+ '.' HEXDIGIT*
| '.' HEXDIGIT+
| HEXDIGIT+
)
PEXP
| '.' DIGIT+ EXP?
| DIGIT+ '.' DIGIT* EXP?
| DIGIT+ EXP
;
// Int完整三种
IntConst
: '0'
| [1-9][0-9]* // decimal
| '0'[0-7]+ // octal
| ('0x' | '0X')[0-9a-fA-F]+ // hex
;
// ---------- 标识符 ----------
Ident
: [a-zA-Z_][a-zA-Z0-9_]*
;
// ---------- 空白 ----------
WS
: [ \t\r\n]+ -> skip
;
// ---------- 注释 ----------
LINE_COMMENT
: '//' ~[\r\n]* -> skip
;
BLOCK_COMMENT
: '/*' .*? '*/' -> skip
;
Loading…
Cancel
Save