改变控制流的语句

2025 年 1 月 12 日 | 2 分钟阅读

goto 语句改变了控制流。如果实现 goto 语句,我们需要为语句定义一个标签(LABEL)。可以为此目的添加一个生成式。

在这个产生式系统中,语义动作用于在符号表中记录标签(LABEL)及其值。

以下文法用于整合结构控制流构造

这里,S 是一个语句,L 是一个语句列表,A 是一个赋值语句,E 是一个布尔值表达式。

改变控制流的语句的翻译方案

  • 我们引入了标记非终结符 M,与布尔表达式的文法类似。
  • 在 if then else 语句中,这个 M 放在语句之前。在 while-do 语句中,我们需要在 E 之前放置 M,因为我们需要在执行完 S 后回到 E。
  • 在 if-then-else 语句中,如果我们将 E 计算为真,则首先执行 S。
  • 之后,我们应该确保代码在第二个 S 之后执行,而不是在 if-then-else 之后执行。然后我们在第一个 S 之后放置另一个非终结符标记 N。

语法如下

该语法的翻译方案如下

产生式规则语义动作
S → if E then M S1BACKPATCH (E.TRUE, M.QUAD)
S.NEXT = MERGE (E.FALSE, S1.NEXT)
S → if E then M1 S1 else
M2 S2
BACKPATCH (E.TRUE, M1.QUAD)
BACKPATCH (E.FALSE, M2.QUAD)
S.NEXT = MERGE (S1.NEXT, N.NEXT, S2.NEXT)
S → while M1 E do M2 S1BACKPATCH (S1,NEXT, M1.QUAD)
BACKPATCH (E.TRUE, M2.QUAD)
S.NEXT = E.FALSE
GEN (goto M1.QUAD)
S → begin L endS.NEXT = L.NEXT
S → AS.NEXT = MAKELIST ()
L → L ; M SBACKPATHCH (L1.NEXT, M.QUAD)
L.NEXT = S.NEXT
L → SL.NEXT = S.NEXT
M → ∈M.QUAD = NEXTQUAD
N→ ∈N.NEXT = MAKELIST (NEXTQUAD)
GEN (goto_)

下一话题三地址码