本项目旨在设计并实现一个能够依据语法分析器来生成高效三地址代码的系统,以支持编译过程中的中间代码生成阶段。
三地址代码是编译原理语法分析后的中间语言的一种。我刚完成了一个三地址代码生成器,符合的语法规则及其语义规则如下(这里没有包含S→if C then S1 else S2这条规则,其余都已完成,也许还有bug,欢迎大家给予指正):
产生式:
- 无具体列出
语义规则:
- **赋值表达式**
- `S → id = E`
- `S.code = E.code || gen(id.place := E.place)`
- **条件判断(if C then S1)**
- `C.true = newlabel; C.false = S.next;`
- `S1.next = S.next;`
- `S.code = C.code || gen(E.true:) || S1.code`
- **条件分支(if C then S1 else S2)**
- 略,未包含在规则中
- **循环语句(while C do S1)**
- `S.begin = newlabel; C.true = newlabel;`
- `C.false = S.next; S1.next = S.begin;`
- `S.code = gen(S.begin:) || C.code || gen(E.true:) || S1.code || gen(goto,S.begin)`
- **条件表达式(C → E1 > E2)**
- `C.code = E1.code || E2.code || gen(if E1.place > E2.place goto C.true) || gen(goto C.false)`
- 同理,还有`<`, `=`等条件表达式的语义规则。
- **算术运算(加法)**
- `E → E1 + T`
- `E.place = newtemp;`
- `E.code = E1.code || T.code || gen(E.place := E1.place + T.place)`
- 同理,还有减法、乘法和除法的语义规则。
- **括号表达式**
- `F → ( E )`
- `F.place = E.place; F.code = E.code`
- **标识符(id)**
- `F → id`
- `F.place = id.name; F.code = `
- **整数常量(int8, int10等)**
- 同理,具体规则为`F → intX`, 其中 X 是具体的数值。
以上是三地址代码生成器的语义规则描述。若有任何问题或发现bug,请随时指正。