Initial commit from sysy-main

This commit is contained in:
Lixuanwang
2025-02-27 23:14:53 +08:00
commit cc523fd30b
1125 changed files with 257793 additions and 0 deletions

122
src/SysY.g4 Normal file
View 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;