个性化阅读
专注于IT技术分析

更改控制流的语句

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_)
赞(0)
未经允许不得转载:srcmini » 更改控制流的语句

评论 抢沙发

评论前必须登录!