编译器设计中整数类型的赋值语句是什么?


赋值语句由表达式组成。它只涉及整型变量。

抽象翻译方案

考虑包含赋值语句的语法。

S → id = E

E → E + E

E → E ∗ E

E → −E

E → (E)

E → id

这里 E 的翻译可以有两个属性 -

  • 𝐄. 𝐏𝐋𝐀𝐂𝐄− 它说明了将保存表达式值的名称。
  • 𝐄. 𝐂𝐎𝐃𝐄− 它表示一个三地址语句序列,用于评估语法中表示赋值语句的表达式 E。E. CODE 表示语句的三地址代码。左侧非终结符的 CODE 是右侧每个非终结符的 CODE 的串联。


                                                    抽象翻译方案

产生式语义动作
S → id = E{S. CODE = E. CODE| |id. PLACE| | '=. '||E. PLACE}
E → E(1) + E(2){T = newtemp( );
E. PLACE = T;
E. CODE = E(1). CODE | |E(2). CODE| |
E. PLACE
| | '=' | |E(1). PLACE | | '+' | |E(2). PLACE }
E → E(1) ∗ E(2){T = newtemp( );
 E. PLACE = T;
E. CODE = E(1). CODE | |E(2). CODE | |
E. PLACE | | '=' | |E(1). PLACE
| | '*' | |E(2). PLACE }
E → −E(1){T = newtemp( );
E. PLACE = T;
E. CODE = E(1). CODE
| |E. PLACE | | '=−' | |E(1). PLACE
 }
E → (E(1)){E. PLACE = E(1). PLACE;
E. CODE = E(1). CODE }
E → id{E. PLACE = id. PLACE;
 E. CODE = null; }

在**第一个产生式**S → id = E 中,

id. PLACE| | '=' | | E. PLACE 是一个字符串,它跟随 S. CODE = E. CODE。

在**第二个产生式**E → E(1) + E(2) 中,

E. PLACE| | '=' | | E(1). PLACE | | '+' | | E(2). PLACE 是一个字符串,它附加到 E. CODE = E(1). CODE ||E(2). CODE。

在**第五个产生式**,即 E → (E(1)) 中,没有字符串跟随 E. CODE = E(1). CODE。这是因为它在产生式的右侧没有任何运算符。

类似地,**第六个产生式**也没有在 E. CODE = null 后附加任何字符串。第六个产生式包含 null,因为产生式的右侧没有表达式出现。因此,由于不存在表达式,所以不存在 CODE 属性,因为 CODE 表示评估表达式的三地址语句序列。

它在其右侧包含 id,它是终结符,但不是表达式。我们也可以使用过程**GEN (Statement)**来代替 S. CODE & E. CODE,因为 GEN 过程会自动生成三地址语句。

因此,GEN 语句将替换 CODE 语句。

替换 CODE 定义的 GEN 语句

产生式语义动作
S → id = EGEN(id. PLACE = E. PLACE)
E → E(1) + E(2)GEN(E. PLACE = E(1). PLACE + E(2). PLACE
E → E(1) ∗ E(2)GEN(E. PLACE = E(1). PLACE ∗ E(2). PLACE
E → −E(1)GEN(E. PLACE = −E(1). PLACE)
E → (E(1))
E → id

更新于: 2021-11-05

5K+ 浏览量

启动你的职业生涯

通过完成课程获得认证

开始学习
广告