改变控制流的语句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 S1 | BACKPATCH (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 S1 | BACKPATCH (S1,NEXT, M1.QUAD) BACKPATCH (E.TRUE, M2.QUAD) S.NEXT = E.FALSE GEN (goto M1.QUAD) | S → begin L end | S.NEXT = L.NEXT | S → A | S.NEXT = MAKELIST () | L → L ; M S | BACKPATHCH (L1.NEXT, M.QUAD) L.NEXT = S.NEXT | L → S | L.NEXT = S.NEXT | M → ∈ | M.QUAD = NEXTQUAD | N→ ∈ | N.NEXT = MAKELIST (NEXTQUAD) GEN (goto_) |
|