编译器设计中整数类型的赋值语句是什么?
赋值语句由表达式组成。它只涉及整型变量。
抽象翻译方案
考虑包含赋值语句的语法。
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 = E | GEN(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 | 无 |
广告