可以处理生成加法的IR
This commit is contained in:
@@ -1,35 +1,73 @@
|
||||
// SysY 子集语法:支持形如
|
||||
// int main() { int a = 1; int b = 2; return a + b; }
|
||||
// 的最小返回表达式编译。
|
||||
|
||||
// 后续需要自行添加
|
||||
grammar SysY;
|
||||
|
||||
// 说明:
|
||||
// - 这是一个“最小可用”的 SysY.g4,用于避免空文件导致的 ANTLR 解析报错。
|
||||
// - 后续请按 SysY 语言规范逐步补全 lexer/parser 规则。
|
||||
// - 本工程约定:ANTLR 生成的 C++ 源码/头文件不进入仓库,统一生成到构建目录(例如 build/generated/antlr4/)。
|
||||
compUnit
|
||||
: funcDef EOF
|
||||
;
|
||||
|
||||
compilationUnit
|
||||
: (statement)* EOF
|
||||
;
|
||||
funcDef
|
||||
: Int Main L_PAREN R_PAREN block
|
||||
;
|
||||
|
||||
statement
|
||||
: 'return' expression? ';'
|
||||
| ';'
|
||||
;
|
||||
block
|
||||
: L_BRACE stmt* R_BRACE
|
||||
;
|
||||
|
||||
expression
|
||||
: IntegerLiteral
|
||||
| Identifier
|
||||
;
|
||||
stmt
|
||||
: varDecl
|
||||
| returnStmt
|
||||
;
|
||||
|
||||
// -------- lexer --------
|
||||
varDecl
|
||||
: Int Ident (Assign exp)? Semi
|
||||
;
|
||||
|
||||
IntegerLiteral
|
||||
: [0-9]+
|
||||
;
|
||||
returnStmt
|
||||
: Return exp Semi
|
||||
;
|
||||
|
||||
Identifier
|
||||
: [a-zA-Z_] [a-zA-Z0-9_]*
|
||||
;
|
||||
exp
|
||||
: addExp
|
||||
;
|
||||
|
||||
Whitespace
|
||||
: [ \t\r\n]+ -> skip
|
||||
;
|
||||
addExp
|
||||
: primary (AddOp primary)*
|
||||
;
|
||||
|
||||
primary
|
||||
: Number
|
||||
| Ident
|
||||
| L_PAREN exp R_PAREN
|
||||
;
|
||||
|
||||
Int : 'int';
|
||||
Return : 'return';
|
||||
Main : 'main';
|
||||
|
||||
AddOp : '+';
|
||||
Assign : '=';
|
||||
Semi : ';';
|
||||
L_PAREN : '(';
|
||||
R_PAREN : ')';
|
||||
L_BRACE : '{';
|
||||
R_BRACE : '}';
|
||||
|
||||
Ident
|
||||
: [a-zA-Z_][a-zA-Z_0-9]*
|
||||
;
|
||||
|
||||
Number
|
||||
: [0-9]+
|
||||
;
|
||||
|
||||
WS
|
||||
: [ \t\r\n]+ -> skip
|
||||
;
|
||||
|
||||
COMMENT
|
||||
: '//' ~[\r\n]* -> skip
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user