更改控制流的语句

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_)

    推荐阅读