// SysY 子集语法:支持形如 // int main() { int a = 1; int b = 2; return a + b; } // 的最小返回表达式编译。 // 后续需要自行添加 grammar SysY; /*===-------------------------------------------===*/ /* Lexer rules */ /*===-------------------------------------------===*/ INT: 'int'; RETURN: 'return'; ASSIGN: '='; ADD: '+'; LPAREN: '('; RPAREN: ')'; LBRACE: '{'; RBRACE: '}'; SEMICOLON: ';'; ID: [a-zA-Z_][a-zA-Z_0-9]*; ILITERAL: [0-9]+; WS: [ \t\r\n] -> skip; LINECOMMENT: '//' ~[\r\n]* -> skip; BLOCKCOMMENT: '/*' .*? '*/' -> skip; /*===-------------------------------------------===*/ /* Syntax rules */ /*===-------------------------------------------===*/ compUnit : funcDef EOF ; decl : btype varDef SEMICOLON ; btype : INT ; varDef : lValue (ASSIGN initValue)? ; initValue : exp ; funcDef : funcType ID LPAREN RPAREN blockStmt ; funcType : INT ; blockStmt : LBRACE blockItem* RBRACE ; blockItem : decl | stmt ; stmt : returnStmt ; returnStmt : RETURN exp SEMICOLON ; exp : LPAREN exp RPAREN # parenExp | var # varExp | number # numberExp | exp ADD exp # additiveExp ; var : ID ; lValue : ID ; number : ILITERAL ;