goto语句更改控制流。如果实现goto语句, 则需要为一条语句定义一个LABEL。可以为此添加产品:
S →LABEL : SLABEL →id
在此生产系统中, 附加了语义动作以将LABEL及其值记录在符号表中。
以下语法用于合并结构控制流构造:
S →if E then SS→if E then S else SS →while E do SS →begin L endS→AL→L ;
SL →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 SS →if E then M S else M SS →while M E do M SS →begin L endS →AL→L ;
M SL →SM →∈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_) |