goto语句更改控制流。如果实现goto语句, 则需要为一条语句定义一个LABEL。可以为此添加产品:
S → LABEL : S
LABEL → id
在此生产系统中, 附加了语义动作以将LABEL及其值记录在符号表中。
以下语法用于合并结构控制流构造:
S → if E then S
S → if E then S else S
S → while E do S
S → begin L end
S→ A
L→ L ; S
L → S
在这里, S是一条语句, L是一条语句列表, A是一个赋值语句, E是一个布尔值表达式。
改变控制流程的陈述的翻译方案
- 在布尔表达式的语法情况下, 我们引入标记非终结符M。
- 如果不是, 则将M都放在语句之前。在使用while的情况下, 我们需要将M放在E之前, 因为我们需要在执行S之后返回它。
- 在if-then-else的情况下, 如果我们将E评估为true, 则将首先执行S。
- 此后, 我们应确保执行if-then else之后的代码, 而不是第二个S。然后, 在第一个S之后放置另一个非末端标记N。
语法如下:
S → if E then M S
S → if E then M S else M S
S → while M E do M S
S → begin L end
S → A
L→ L ; M S
L → S
M → ∈
N → ∈
该语法的翻译方案如下:
生产规则 | 语义动作 |
---|---|
S→如果E则M S1 | BACKPATCH(E.TRUE, M.QUAD)S.NEXT =合并(E.FALSE, S1.NEXT) |
S→如果E则M1 S1否则M2 S2 | BACKPATCH(E.TRUE, M1.QUAD)BACKPATCH(E.FALSE, M2.QUAD)S.NEXT =合并(S1.NEXT, N.NEXT, S2.NEXT) |
S→而M1 E做M2 S1 | BACKPATCH(S1, NEXT, M1.QUAD)BACKPATCH(E.TRUE, M2.QUAD)S.NEXT = E.FALSE GEN(转到M1.QUAD) |
S→开始L结束 | S.NEXT = L.NEXT |
S→A | S.NEXT = MAKELIST() |
L→L;女士 | 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_) |
评论前必须登录!
注册