Initial commit from sysy-main
This commit is contained in:
122
src/SysY.g4
Normal file
122
src/SysY.g4
Normal file
@@ -0,0 +1,122 @@
|
||||
grammar SysY;
|
||||
|
||||
/*===-------------------------------------------===*/
|
||||
/* Lexer rules */
|
||||
/*===-------------------------------------------===*/
|
||||
|
||||
// fragments
|
||||
fragment DecDigit: [0-9];
|
||||
fragment OctDigit: [0-7];
|
||||
fragment HexDigit: [0-9a-fA-F];
|
||||
fragment OctPrefix: '0';
|
||||
fragment HexPrefix: '0' [xX];
|
||||
fragment NonZeroDecDigit: [1-9];
|
||||
fragment ESC: '\\"' | '\\\\';
|
||||
|
||||
// keywords
|
||||
INT: 'int';
|
||||
FLOAT: 'float';
|
||||
CONST: 'const';
|
||||
// operators
|
||||
ADD: '+';
|
||||
|
||||
// punctuations
|
||||
|
||||
// identifier
|
||||
IDENT: IDENTNONDIGIT (IDENTNONDIGIT | DecDigit)*;
|
||||
IDENTNONDIGIT: [a-zA-Z_];
|
||||
|
||||
// literals
|
||||
ILITERAL: INTCONST | FLOATCONST;
|
||||
// string
|
||||
STRING: '"' (ESC | .)*? '"';
|
||||
|
||||
// white space and comments
|
||||
WS: [ \t\r\n] -> skip;
|
||||
LINECOMMENT: '//' .*? '\r'? '\n' -> skip;
|
||||
BLOCKCOMMENT: '/*' .*? '*/' -> skip;
|
||||
|
||||
|
||||
|
||||
INTCONST: NonZeroDecDigit DecDigit*
|
||||
| OctPrefix OctDigit*
|
||||
| HexPrefix HexDigit+;
|
||||
|
||||
DIGITSEQUENCE: DecDigit+;
|
||||
|
||||
// Floating point constants
|
||||
FLOATCONST: DecimalFloatingConstant
|
||||
| HexadecimalFloatingConstant;
|
||||
DecimalFloatingConstant: FractionalConstant ExponentPart? // 允许无指数
|
||||
| DIGITSEQUENCE ExponentPart; // 保留原有形式
|
||||
|
||||
HexadecimalFloatingConstant: HexPrefix HexadecimalFractionalConstant BinaryExponentPart
|
||||
| HexPrefix HexadecimalDigitSequence BinaryExponentPart;
|
||||
FractionalConstant: DIGITSEQUENCE? '.' DIGITSEQUENCE
|
||||
| DIGITSEQUENCE '.';
|
||||
ExponentPart:
|
||||
[eE] [+-]? DIGITSEQUENCE;
|
||||
HexadecimalFractionalConstant: HexadecimalDigitSequence? '.' HexadecimalDigitSequence
|
||||
| HexadecimalDigitSequence '.';
|
||||
HexadecimalDigitSequence: HexDigit+;
|
||||
BinaryExponentPart:
|
||||
[pP] [+-]? DIGITSEQUENCE;
|
||||
|
||||
/*===-------------------------------------------===*/
|
||||
/* Syntax rules */
|
||||
/*===-------------------------------------------===*/
|
||||
// module: funcRParams;
|
||||
// compUnit: (dcl | funcDef)+;
|
||||
module: (dcl | funcDef)+ | funcRParams;
|
||||
|
||||
funcRParams: funcRParam (',' funcRParam)*;
|
||||
|
||||
funcRParam: number # expAsRParam | string # stringAsRParam | exp (',' exp)* # expsAsRParam;
|
||||
// funcRParam: exp (',' exp)*;
|
||||
|
||||
number: ILITERAL;
|
||||
|
||||
string: STRING;
|
||||
|
||||
bType: INT | FLOAT;
|
||||
dcl: constDecl | varDecl;
|
||||
constDecl: CONST bType constDef (',' constDef)* ';';
|
||||
constDef: IDENT ( '[' constExp ']' )* '=' constInitVal;
|
||||
constInitVal: constExp
|
||||
| '{' (constInitVal (',' constInitVal)*)? '}';
|
||||
varDecl: bType varDef (',' varDef)* ';';
|
||||
varDef: IDENT ( '[' constExp ']' )* initVal?
|
||||
| IDENT ( '[' constExp ']' )* '=' initVal;
|
||||
initVal: exp | '{' ( initVal ( ',' initVal )* )? '}';
|
||||
|
||||
funcDef: funcType IDENT '(' funcFParams? ')' block;
|
||||
funcType: bType | 'void';
|
||||
funcFParams: funcFParam (',' funcFParam )*;
|
||||
funcFParam: bType IDENT ( '[' ']' ( '[' exp ']' )* )?;
|
||||
block: '{' blockItem* '}';
|
||||
blockItem: dcl | stmt;
|
||||
stmt: lVal '=' exp ';'
|
||||
| exp? ';'
|
||||
// | IDENT '(' funcRParams? ')' ';'
|
||||
| block
|
||||
| 'if' '(' cond ')' stmt ('else' stmt)?
|
||||
| 'while' '(' cond ')' stmt
|
||||
| 'break' ';'
|
||||
| 'continue' ';'
|
||||
| 'return' exp? ';';
|
||||
|
||||
exp: addExp;
|
||||
cond: lorExp;
|
||||
lVal: IDENT ( '[' exp ']' )*;
|
||||
primaryExp: '(' exp ')' | lVal | number;
|
||||
// number: INTCONST | FLOATCONST;
|
||||
unaryExp: primaryExp | IDENT '(' funcRParams? ')'
|
||||
| unaryOp unaryExp;
|
||||
unaryOp: '+' | '-' | '!';
|
||||
mulExp: unaryExp (('*' | '/' | '%') unaryExp)*;
|
||||
addExp: mulExp | addExp ('+' | '-') mulExp;
|
||||
relExp: addExp | relExp ('<' | '>' | '<=' | '>=') addExp;
|
||||
eqExp: relExp | eqExp ('==' | '!=') relExp;
|
||||
landExp: eqExp | landExp '&&' eqExp;
|
||||
lorExp: landExp | lorExp '||' landExp;
|
||||
constExp: addExp;
|
||||
Reference in New Issue
Block a user