📜  流更改语句

📅  最后修改于: 2020-12-06 07:29:23             🧑  作者: Mango

改变控制流程的陈述

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 →    ∈

该语法的翻译方案如下:

Production rule Semantic actions
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_)