编译原理个人作业--第四章

构造FIRST和FOLLOW的大白话网站

第四章

1

考虑文法 G 1 G_1 G1:
S → a ∣ ∧ ∣ ( T ) T → T , S ∣ S S \rightarrow a|\land|(T) \\ T\rightarrow T,S|S Sa(T)TT,SS

先复习左递归如何消除 原书p69页

  1. 类似于 P → P a ∣ b P\rightarrow Pa|b PPab的形式,可以改写成
  • P → b P ′ P\rightarrow bP^{'} PbP
  • P ′ → a P ′ ∣ ϵ P^{'}\rightarrow aP^{'}|\epsilon PaPϵ
  1. 提公因子 P → P a 1 ∣ . . . ∣ P a m ∣ b 1 ∣ . . . b n ∣ P\rightarrow Pa_1|...|Pa_m|b_1|...b_n| PPa1∣...∣Pamb1∣...bn 转换为
  • P → b 1 P ′ ∣ . . . ∣ b n P ′ ∣ P\rightarrow b_1P^{'}|...|b_nP^{'}| Pb1P∣...∣bnP
  • P ′ → a 1 P ′ ∣ . . . ∣ a m P ′ ∣ ϵ P^{'}\rightarrow a_1P^{'}|...|a_mP^{'}|\epsilon Pa1P∣...∣amPϵ

(1) 消除 G 1 G_1 G1左递归。并对每个非终结符,写出不带回溯的递归子程序

1. 消除左递归

分析:不难发现,左递归只在第二条地推中出现,应修改第二条

  1. 将b后面塞上一个新非终结符,删去原有的左递归部分
  2. 新非终结符可以递推出 左递归右半部分 + 新非终结符

S → a ∣ ∧ ∣ ( T ) T → S A A → , S A ∣ ϵ S \rightarrow a|\land|(T) \\ T\rightarrow SA\\ A\rightarrow ,SA|\epsilon Sa(T)TSAA,SAϵ

2.递归下降子程序

详见原书 p74

procedure S;
begin
    if (sym = 'a') or (sym = '^')
        then advancce;
    else if sym = '('
        then begin
            advance; 
            T
            if sym = ')'
                then advance
            else 
                error
        end
    else 
        error;
end


procedure T;
begin
    S;A
end


procedure A;
begin
    if sym = ','
        then begin
        advance;
        S;
        A
        end
    else error
end

根据74页的定义

advance :  输入串指示器IP 指向下一个输入符号
sym :       IP当前所指的输入符号
error :     出错程序

根据原文




(2) 改写后的文法是否为LL(1)的,给出预测分析表

知识点

证明文法为LL(1)

预测分析表 M 不含多重定义入口 ⇔ 文法为 L L ( 1 ) 预测分析表M不含多重定义入口 \Leftrightarrow 文法为LL(1) 预测分析表M不含多重定义入口文法为LL(1)

构造分析表M算法

首先需要构造FISRT集

  • X ∈ V T X\in V_T XVT,则 F I R S T ( X ) = { X } FIRST(X) = \{X\} FIRST(X)={ X}
  • X ∈ V N ∧ X → a . . . X\in V_N \land X\rightarrow a... XVNXa..., 把a放入 F I R S T ( X ) FIRST(X) FIRST(X)
    • X → ϵ X\rightarrow \epsilon Xϵ ϵ \epsilon ϵ也放入 F I R S T ( X ) FIRST(X) FIRST(X)
  • X → Y . . . ∧ Y ∈ V N X\rightarrow Y... \land Y\in V_N XY...YVN, 将 F I R S T ( Y ) − ϵ FIRST(Y) - \epsilon FIRST(Y)ϵ 的元素加入 F I R S T ( X ) FIRST(X) FIRST(X)
    • X → Y 1 Y 2 . . . Y k . . . ∧ Y 1 , . . . , Y i − 1 非终结符 ∧ 对于任何 j ( 1 ≤ j ≤ i − 1 ) , F I R S T ( Y j ) 含有 ϵ X\rightarrow Y_1Y_2...Y_k... \land Y_1,...,Y_{i-1}非终结符\land 对于任何j(1\le j \le i - 1), FIRST(Y_j)含有\epsilon XY1Y2...Yk...Y1,...,Yi1非终结符对于任何j(1ji1),FIRST(Yj)含有ϵ, 则把 F I R S T ( Y i ) − ϵ FIRST(Y_i)-\epsilon FIRST(Yi)ϵ加入 F I R S T ( X ) 中 FIRST(X)中 FIRST(X)
    • 特别的,若所有的 F I R S T ( Y j ) 都含有 ϵ , j = 1 , 2 , . . . , k FIRST(Y_j)都含有\epsilon, j = 1,2,..., k FIRST(Yj)都含有ϵ,j=1,2,...,k, 把 ϵ \epsilon ϵ 加入 F I R S T ( X ) FIRST(X) FIRST(X)

省流:在生成式右边,在最开头的终结符直接计入FIRST 然后开头的终结符除了epsilon也全计入, 如果右边整个串可以推导出空串,epsilon也计入

然后构造FOLLOW集

  • 对于文法开始符号 S S S,放置# F O L L O W ( S ) FOLLOW(S) FOLLOW(S)
    • 下面这个处理的是first,在B后面FIRST 放入 前一个非终结符的FOLLOW
  • A → α B β A\rightarrow \alpha B\beta Aα,   把 F I R S T ( β ) − ϵ FIRST(\beta) - \epsilon FIRST(β)ϵ 放入 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)
    • 后两种本质是同一种,将生成式左半部分的FOLLOW末尾的非终结符FOLLOW
  • A → α B A\rightarrow \alpha B AαB,    把 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)放入 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)
  • A → α B β ∧ β ⇒ ϵ A\rightarrow \alpha B\beta \land \beta \Rightarrow\epsilon Aαβϵ (也就是说 ϵ ∈ F I R S T ( β ) \epsilon \in FIRST(\beta) ϵFIRST(β)),   把 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)放入 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)

最后构造M

  1. 对文法 G G G 产生式 A → α A\rightarrow \alpha Aα 进行(2)(3)操作
  2. 终结符 a ∈ F I R S T ( α ) a\in FIRST(\alpha) aFIRST(α) 加入 M [ A , a ] M[A, a] M[A,a]
  3. ϵ ∈ F I R S T ( α ) \epsilon \in FIRST(\alpha) ϵFIRST(α),则对任何 b ∈ F O L L O W ( A ) b \in FOLLOW(A) bFOLLOW(A),把 A → α A\rightarrow \alpha Aα 放入 M [ A , b ] M[A, b] M[A,b]
  4. 没有定义则出错




解题过程

① 构造FIRST

首先考虑

S → a ∣ ∧ ∣ ( T ) S \rightarrow a|\land|(T) Sa(T)

不难发现,a,^,(都出现在了产生式右端的最左端,
所以有

F I R S T ( S ) = { a , ∧ , ( } FIRST(S) = \{a,\land, (\} FIRST(S)={ a,,(}

考虑

T → S A T\rightarrow SA TSA

根据构造FOLLOW集的第四种情况,需要将 F I R S T ( S ) − ϵ 所有元素放入 F I R S T ( T ) 中 FIRST(S) - \epsilon所有元素放入 FIRST(T)中 FIRST(S)ϵ所有元素放入FIRST(T)

F I R S T ( T ) = { a , ∧ , ( } FIRST(T) = \{a,\land, (\} FIRST(T)={ a,,(}

考虑

A → , S A ∣ ϵ A\rightarrow ,SA|\epsilon A,SAϵ

F I R S T ( A ) = { , , ϵ } FIRST(A) = \{, , \epsilon\} FIRST(A)={ ,ϵ}




② 构造FOLLOW
我们已经有了
F I R S T ( S ) = { a , ∧ , ( } FIRST(S) = \{a,\land, (\} FIRST(S)={ a,,(}
F I R S T ( T ) = { a , ∧ , ( } FIRST(T) = \{a,\land, (\} FIRST(T)={ a,,(}
F I R S T ( A ) = { , , ϵ } FIRST(A) = \{, , \epsilon\} FIRST(A)={ ,ϵ}

首先考虑

S → a ∣ ∧ ∣ ( T ) S \rightarrow a|\land|(T) Sa(T)

  • 根据规则1,需要存# F O L L O W ( S ) FOLLOW(S) FOLLOW(S)
  • 根据规则2,需要将 F I R S T ( ) ) − ϵ FIRST())-\epsilon FIRST()ϵ的元素放进去 F O L L O W ( T ) FOLLOW(T) FOLLOW(T)

于是第一步我们有

F O L L O W ( S ) = { # } F O L L O W ( T ) = { ) } FOLLOW(S) = \{\#\}\\ FOLLOW(T) = \{)\} FOLLOW(S)={ #}FOLLOW(T)={ )}

考虑

T → S A T\rightarrow SA TSA

  • 根据规则3,需要将 F O L L O W ( T ) FOLLOW(T) FOLLOW(T)的元素放进去 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)

得到

F O L L O W ( S ) = { # } F O L L O W ( T ) = { ) } F O L L O W ( A ) = { ) } FOLLOW(S) = \{\#\}\\ FOLLOW(T) = \{)\}\\ FOLLOW(A) = \{)\} FOLLOW(S)={ #}FOLLOW(T)={ )}FOLLOW(A)={ )}

考虑

A → , S A ∣ ϵ A\rightarrow ,SA|\epsilon A,SAϵ

  • 根据规则2,需要将 F I R S T ( A ) − ϵ FIRST(A) - \epsilon FIRST(A)ϵ的元素放进去 F O L L O W ( S ) FOLLOW(S) FOLLOW(S)
  • 根据规则4(A可以推导出 ϵ \epsilon ϵ),需要将 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)的元素放进去 F O L L O W ( S ) FOLLOW(S) FOLLOW(S)

得到

F O L L O W ( S ) = { , , ) , # } F O L L O W ( T ) = { ) } F O L L O W ( A ) = { ) } FOLLOW(S) = \{,, ),\#\}\\ FOLLOW(T) = \{)\}\\ FOLLOW(A) = \{)\} FOLLOW(S)={ ,),#}FOLLOW(T)={ )}FOLLOW(A)={ )}




③ 构造M

在这里插入图片描述

S → a ∣ ∧ ∣ ( T ) T → S A A → , S A ∣ ϵ S \rightarrow a|\land|(T) \\ T\rightarrow SA\\ A\rightarrow ,SA|\epsilon Sa(T)TSAA,SAϵ

F I R S T ( S ) = { a , ∧ , ( } F I R S T ( T ) = { a , ∧ , ( } F I R S T ( A ) = { , , ϵ } F O L L O W ( S ) = { , , ) , # } F O L L O W ( T ) = { ) } F O L L O W ( A ) = { ) } FIRST(S) = \{a,\land, (\}\quad FIRST(T) = \{a,\land, (\} \quad FIRST(A) = \{, , \epsilon\} \\ FOLLOW(S) = \{,, ),\#\}\quad FOLLOW(T) = \{)\}\quad FOLLOW(A) = \{)\} FIRST(S)={ a,,(}FIRST(T)={ a,,(}FIRST(A)={ ,ϵ}FOLLOW(S)={ ,),#}FOLLOW(T)={ )}FOLLOW(A)={ )}

对这三个生成式套用步骤2

首先按照 F I R S T ( S ) FIRST(S) FIRST(S) 我们有

a a a ∧ \land ( ( ( ) ) ) , , , # \# #
S S S S → a S\rightarrow a Sa S → ∧ S\rightarrow \land S S → ( T ) S\rightarrow (T) S(T)




然后按照 F I R S T ( T ) FIRST(T) FIRST(T) 我们有

a a a ∧ \land ( ( ( ) ) ) , , , # \# #
S S S S → a S\rightarrow a Sa S → ∧ S\rightarrow \land S S → ( T ) S\rightarrow (T) S(T)
T T T T → S A T\rightarrow SA TSA T → S A T\rightarrow SA TSA T → S A T\rightarrow SA TSA



根据 F I R S T ( A ) FIRST(A) FIRST(A)

a a a ∧ \land ( ( ( ) ) ) , , , # \# #
S S S S → a S\rightarrow a Sa S → ∧ S\rightarrow \land S S → ( T ) S\rightarrow (T) S(T)
T T T T → S A T\rightarrow SA TSA T → S A T\rightarrow SA TSA T → S A T\rightarrow SA TSA
A A A A → ϵ A\rightarrow \epsilon Aϵ A → , S A A\rightarrow ,SA A,SA

对这三个生成式套用步骤3,发现满足步骤3的只有 A → ϵ A\rightarrow \epsilon Aϵ A → , S A A\rightarrow ,SA A,SA这个生成式中, , S A ,SA ,SA无法变成 ϵ \epsilon ϵ

  • ϵ ∈ F I R S T ( A ) \epsilon \in FIRST(A) ϵFIRST(A),对 ∀ b ∈ F O L L O W ( A ) \forall b\in FOLLOW(A) bFOLLOW(A) A → α A\rightarrow\alpha Aα 放入M[A,b]中

不难发现FOLLOW(A)只有右括号 }, 然后重复填入 A → ϵ A\rightarrow \epsilon Aϵ

最终的M没有多重定义入口
所以满足LL(1)





2

考虑文法G:

E → T E ′ E ′ → + E ∣ ϵ T → F T ′ T ′ → T ∣ ϵ F → P F ′ F ′ → ∗ F ′ ∣ ϵ P → ( E ) ∣ a ∣ b ∣ ∧ E\rightarrow TE^{'}\\E^{'}\rightarrow +E|\epsilon\\T\rightarrow FT^{'}\\ T^{'}\rightarrow T|\epsilon\\F\rightarrow PF^{'}\\F^{'}\rightarrow *F^{'}|\epsilon\\P\rightarrow (E)|a|b|\land ETEE+EϵTFTTTϵFPFFFϵP(E)ab





(1) 计算文法G非终结符的FIRST和FOLLOW

计算FIRST

① 首先根据规则1: 若右边第一个符号是终结符或 ε ,则直接将其加入 FIRST(X)构造出最初始的FIRST

F I R S T ( E ) F I R S T ( E ′ ) = { + , ϵ } F I R S T ( T ) F I R S T ( T ′ ) = { ϵ } F I R S T ( F ) F I R S T ( F ′ ) = { ∗ , ϵ } F I R S T ( P ) = { ( , a , b , ∧ } FIRST(E)\quad FIRST(E^{'}) = \{+,\epsilon\} \quad FIRST(T) \quad FIRST(T^{'}) = \{\epsilon\} \\ FIRST(F) \quad FIRST(F^{'}) = \{*,\epsilon\} \quad FIRST(P) = \{ (, a, b, \land \} FIRST(E)FIRST(E)={ +,ϵ}FIRST(T)FIRST(T)={ ϵ}FIRST(F)FIRST(F)={ ,ϵ}FIRST(P)={(,a,b,}

② 考虑规则2,右边第一个符号是非终结符,则将其 FIRST 集的的非 ε 元素加入 FIRST(X)

F I R S T ( E ) = { ( , a , b , ∧ } F I R S T ( E ′ ) = { + , ϵ } F I R S T ( T ) = { ( , a , b , ∧ } F I R S T ( T ′ ) = { ( , a , b , ∧ , ϵ } F I R S T ( F ) = { ( , a , b , ∧ } F I R S T ( F ′ ) = { ∗ , ϵ } F I R S T ( P ) = { ( , a , b , ∧ } FIRST(E) = \{ (, a, b, \land \}\quad FIRST(E^{'}) = \{+,\epsilon\} \quad \\ FIRST(T) = \{ (, a, b, \land \} \quad FIRST(T^{'}) = \{(, a, b, \land, \epsilon\} \\ FIRST(F) = \{ (, a, b, \land \} \quad FIRST(F^{'}) = \{*,\epsilon\} \quad FIRST(P) = \{ (, a, b, \land \} FIRST(E)={(,a,b,}FIRST(E)={ +,ϵ}FIRST(T)={(,a,b,}FIRST(T)={(,a,b,,ϵ}FIRST(F)={(,a,b,}FIRST(F)={ ,ϵ}FIRST(P)={(,a,b,}

再次检查规则1,2,3发现无法再使任意一个FIRST集合产生变化,故构造FOLLOW集合





FOLLOW集

首先使用规则1 若A->aBb是一条规则,则把FIRST(b)中的非ε元素加到FOLLOW(B)中,其中#为终止符,默认放在起始符的FOLLOW集合中

$$FOLLOW(E) = {#,)}\quad
FOLLOW(E^{‘}) = {} \quad
FOLLOW(T) ={+} \quad
FOLLOW(T^{’}) = {} \

FOLLOW(F) = {(, a, b, \land} \quad
FOLLOW(F^{'}) = {} \quad
FOLLOW§ = { * }
$$

使用规则2 若A->aB或A->aBb是一条规则且b=>ε,则把FOLLOW(A)加到FOLLOW(B)中;

F O L L O W ( E ) = { # , ) } F O L L O W ( E ′ ) = { # , ) } F O L L O W ( T ) = { # , ) , + } F O L L O W ( T ′ ) = { # , ) , + } F O L L O W ( F ) = { ( , a , b , ∧ , # , ) , + } F O L L O W ( F ′ ) = { ( , a , b , ∧ , # , ) , + } F O L L O W ( P ) = { ( , a , b , ∧ , # , ) , + , ∗ } FOLLOW(E) = \{\#,)\}\quad FOLLOW(E^{'}) = \{\#,)\} \quad FOLLOW(T) =\{\#,),+\} \quad FOLLOW(T^{'}) = \{\#,),+\} \\ FOLLOW(F) = \{(, a, b, \land, \#,),+\} \quad FOLLOW(F^{'}) = \{(, a, b, \land, \#,),+\} \quad FOLLOW(P) = \{ (, a, b, \land, \#,),+, * \} FOLLOW(E)={ #,)}FOLLOW(E)={ #,)}FOLLOW(T)={ #,),+}FOLLOW(T)={ #,),+}FOLLOW(F)={(,a,b,,#,),+}FOLLOW(F)={(,a,b,,#,),+}FOLLOW(P)={(,a,b,,#,),+,}





(2) 证明文法为LL(1)

除了直接构造矩阵M看是否有多重入口,还可以使用p73的证明

  1. 文法无左递归
  2. 对文法非终结符A产生的候选符集合两两不相交 对于 A → a 1 ∣ . . . ∣ a n F i r s t ( a i ) ∩ F i r s t ( a j ) = ∅ 对于A\rightarrow a_1|...|a_n\quad First(a_i)\cap First(a_j) = \empty 对于Aa1∣...∣anFirst(ai)First(aj)=
  3. 文法非终结符A,若他候选符集包含 ϵ \epsilon ϵ F I R S T ( A ) ∩ F O L L O W ( A ) = ∅ FIRST(A)\cap FOLLOW(A) = \empty FIRST(A)FOLLOW(A)=

① 不难发现,该文法无左递归

有多个候选符的产生式为 第二,第四,第六,第七行

不难发现
注意,你要求的是一整个串,比如+E,就得求FIRST(+E),而 +E的首字符只有+

F I R S T ( + E ) = { + } ∩ F I R S T ( ϵ ) = ∅ F I R S T ( T ) = { ( , a , b , ∧ } ∩ F I R S T ( ϵ ) = ∅ F I R S T ( ∗ F ′ ) = { ∗ } ∩ F I R S T ( ϵ ) = ∅ F I R S T ( ( E ) ) = { ( } , 与 a , b , ∧ 构成的 F I R S T 集两两不相交 FIRST(+E) = \{+\} \cap FIRST(\epsilon) = \empty\\ FIRST(T) = \{ (, a, b, \land\}\cap FIRST(\epsilon) = \empty\\ FIRST(*F^{'}) = \{*\} \cap FIRST(\epsilon) = \empty \\ FIRST((E)) = \{ (\},与a,b,\land构成的FIRST集两两不相交 FIRST(+E)={ +}FIRST(ϵ)=FIRST(T)={(,a,b,}FIRST(ϵ)=FIRST(F)={ }FIRST(ϵ)=FIRST((E))={(},a,b,构成的FIRST集两两不相交


产生式含 ϵ \epsilon ϵ的为第二,第四,第六行。显然

F I R S T ( E ′ ) ∩ F O L L O W ( E ′ ) = ∅ F I R S T ( T ′ ) ∩ F O L L O W ( T ′ ) = ∅ F I R S T ( F ′ ) ∩ F O L L O W ( F ′ ) = ∅ FIRST(E^{'}) \cap FOLLOW (E^{'}) = \empty \\ FIRST(T^{'}) \cap FOLLOW (T^{'}) = \empty \\ FIRST(F^{'}) \cap FOLLOW (F^{'}) = \empty FIRST(E)FOLLOW(E)=FIRST(T)FOLLOW(T)=FIRST(F)FOLLOW(F)=

综上,其为LL(1)文法

(3) 构造它的预测分析表

构造M

  1. 对文法 G G G 产生式 A → α A\rightarrow \alpha Aα 进行(2)(3)操作
  2. 终结符 a ∈ F I R S T ( α ) a\in FIRST(\alpha) aFIRST(α) 加入 M [ A , a ] M[A, a] M[A,a]
  3. ϵ ∈ F I R S T ( α ) \epsilon \in FIRST(\alpha) ϵFIRST(α),则对任何 b ∈ F O L L O W ( A ) b \in FOLLOW(A) bFOLLOW(A),把 A → α A\rightarrow \alpha Aα 放入 M [ A , b ] M[A, b] M[A,b]
  4. 没有定义则出错

E → T E ′ E\rightarrow TE^{'} ETE , 我们根据规则2

+ * a b #
E E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE

E ′ → + E ∣ ϵ E^{'}\rightarrow +E|\epsilon E+Eϵ , 我们根据规则2

+ * a b #
E E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE
E’ E ′ → + E E^{'}\rightarrow +E E+E

根据规则3

+ * a b #
E E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE
E’ E ′ → + E E^{'}\rightarrow +E E+E E ′ → ϵ E^{'}\rightarrow \epsilon Eϵ E ′ → ϵ E^{'}\rightarrow \epsilon Eϵ

最终得到如下分析表

+ * a b #
E E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE E → T E ′ E\rightarrow TE^{'} ETE
E’ E ′ → + E E^{'}\rightarrow +E E+E E ′ → ϵ E^{'}\rightarrow \epsilon Eϵ E ′ → ϵ E^{'}\rightarrow \epsilon Eϵ
T T → F T ′ T\rightarrow FT^{'} TFT T → F T ′ T\rightarrow FT^{'} TFT T → F T ′ T\rightarrow FT^{'} TFT T → F T ′ T\rightarrow FT^{'} TFT
T’ T ′ → ϵ T^{'}\rightarrow \epsilon Tϵ T ′ → T T^{'}\rightarrow T TT T ′ → ϵ T^{'}\rightarrow \epsilon Tϵ T ′ → T T^{'}\rightarrow T TT T ′ → T T^{'}\rightarrow T TT T ′ → T T^{'}\rightarrow T TT T ′ → ϵ T^{'}\rightarrow \epsilon Tϵ
F F → P F ′ F\rightarrow PF^{'} FPF F → P F ′ F\rightarrow PF^{'} FPF F → P F ′ F\rightarrow PF^{'} FPF F → P F ′ F\rightarrow PF^{'} FPF
F’ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ∗ F ′ F^{'}\rightarrow *F^{'} FF F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ F ′ → ϵ F^{'}\rightarrow \epsilon Fϵ
P P → ( E ) P\rightarrow (E) P(E) P → a P\rightarrow a Pa P → b P\rightarrow b Pb P → ∧ P\rightarrow \land P





(4) 构造它的递归下降分析程序

procedure E:
begin
    if sym = '(' 
        or sym = 'a'
        or sym = 'B'
        or sym = '^'
        then begin
            T;
            E’
        end
    else
        error
end

procedure E’:
begin
    if sym = '+'
        then begin
            advance;
            E
        end
    else if sym <> ')' 
        and sym <> '#'
        then error
end

procedure T:
begin
    if sym = '(' 
        or sym = 'a'
        or sym = 'B'
        or sym = '^'
        then begin
            F;
            T’
        end
    else
        error
end

procedure T’:
begin
    if sym = '(' 
        or sym = 'a'
        or sym = 'B'
        or sym = '^'
        then begin
            T;
        end
    else if sym = '*'
        error
end

procedure F:
begin
    if sym = '(' 
        or sym = 'a'
        or sym = 'B'
        or sym = '^'
        then begin
            P;
            F’
        end
    else
        error
end

procedure F’:
begin
    if sym = '*' 
        then begin
            advance;
            F’
        end
end

procedure P:
begin
    if  sym = 'a'
        or sym = 'B'
        or sym = '^'
        then advance
        
    else if sym = '(' 
        then begin
        advance;
        E;
        if sym = ')'
            then advance
        else
            error
        end
        
    else
        error
end

3

下面文法中那些是LL(1)文法?

一个文法G的预测分析表M不含多重定义入口,当且仅当该文法为LL(1)的。

什么时候没有多重入口?从M的构造入手

  1. 生成时左部如果相同的话,他们各自的右部FIRST两两不相交(不然会有多重入口
  2. 其次,右边若存在epsilon属于某一个FIRST——并且最多只有一个能生成epsilon串(不然根据条件①也是会重复的),需要保证左部的FOLLOW和其余的右部FIRST两两不相交
    (要是不会写这个那直接构造M也是可以的,但是都能构造M了,上面这个其实也应该懂。
    顺便注意一下:2的操作等价于 F O L L O W ( A ) ∩ F I R S T ( A ) = ∅ FOLLOW(A)\cap FIRST(A)=\empty FOLLOW(A)FIRST(A)=,因为右部的first的并集就是你左部的first

(1)

S → A B c A → a ∣ ϵ B → b ∣ ϵ S\rightarrow ABc\\ A\rightarrow a|\epsilon\\ B\rightarrow b|\epsilon\\ SABcAaϵBbϵ

不含左递归

显然第二第三行的候选终结首符集两两不相交

由于第二第三行推导式右边含 ϵ \epsilon ϵ

先求出相关的FIRST和FOLLOW集合
F I R S T ( S ) = { a , b , c } F O L L O W ( S ) = { # } F I R S T ( A ) = { a , ϵ } F O L L O W ( A ) = { b , c } F I R S T ( B ) = { b , ϵ } F O L L O W ( B ) = { c } FIRST(S) = \{a,b,c\} \quad FOLLOW(S) =\{\# \}\\ FIRST(A) = \{a, \epsilon\}\quad FOLLOW(A) =\{b,c\}\\ FIRST(B) = \{b, \epsilon\}\quad FOLLOW(B) =\{c \}\\ FIRST(S)={ a,b,c}FOLLOW(S)={ #}FIRST(A)={ a,ϵ}FOLLOW(A)={ b,c}FIRST(B)={ b,ϵ}FOLLOW(B)={ c}

不难发现A,B对应的FIRST集与FOLLOW集合相交为空集

满足LL(1)



(2)

S → A b A → a ∣ B ∣ ϵ B → b ∣ ϵ S\rightarrow Ab\\ A\rightarrow a|B|\epsilon\\ B\rightarrow b|\epsilon SAbAaBϵBbϵ

不含左递归

F I R S T ( S ) = { a , b } F O L L O W ( S ) = { # } F I R S T ( A ) = { a , b , ϵ } F O L L O W ( A ) = { b } F I R S T ( B ) = { b , ϵ } F O L L O W ( B ) = { b } FIRST(S) = \{a,b\} \quad FOLLOW(S) =\{\# \}\\ FIRST(A) = \{a, b,\epsilon\}\quad FOLLOW(A) =\{b\}\\ FIRST(B) = \{b, \epsilon\}\quad FOLLOW(B) =\{ b\}\\ FIRST(S)={ a,b}FOLLOW(S)={ #}FIRST(A)={ a,b,ϵ}FOLLOW(A)={ b}FIRST(B)={ b,ϵ}FOLLOW(B)={ b}

由于A->B,参考规则2(因为B后面没字符串了,为空船),需要将follow(A)传递给follow(B)

对于第二行导出式子,有 F I R S T ( B ) ∩ F I R S T ( ϵ ) = { ϵ } FIRST(B)\cap FIRST(\epsilon) = \{\epsilon\} FIRST(B)FIRST(ϵ)={ ϵ}

不符合LL(1)



(3)

S → A B B A A → a ∣ ϵ B → b ∣ ϵ S\rightarrow ABBA\\ A\rightarrow a|\epsilon\\ B\rightarrow b|\epsilon SABBAAaϵBbϵ

不含左递归

F I R S T ( S ) = { a , b , ϵ } F O L L O W ( S ) = { # } F I R S T ( A ) = { a , ϵ } F O L L O W ( A ) = { b , # } F I R S T ( B ) = { a , b , ϵ } F O L L O W ( B ) = { a , b , # } FIRST(S) = \{a,b,\epsilon\} \quad FOLLOW(S) =\{\# \}\\ FIRST(A) = \{a,\epsilon\}\quad FOLLOW(A) =\{b,\#\}\\ FIRST(B) = \{a, b,\epsilon\}\quad FOLLOW(B) =\{a, b, \#\}\\ FIRST(S)={ a,b,ϵ}FOLLOW(S)={ #}FIRST(A)={ a,ϵ}FOLLOW(A)={ b,#}FIRST(B)={ a,b,ϵ}FOLLOW(B)={ a,b,#}

对于第二行和第三行,他们的候选终结首符集两两不相交

F I R S T ( B ) ∩ F O L L O W ( B ) = { a , b } ≠ ∅ FIRST(B)\cap FOLLOW(B) = \{a,b\} \neq \empty FIRST(B)FOLLOW(B)={ a,b}=

不满足LL(1)



(4)

S → a S e ∣ B B → b B e ∣ C C → c C e ∣ d S\rightarrow aSe|B\\ B\rightarrow bBe|C\\ C\rightarrow cCe|d SaSeBBbBeCCcCed

不含左递归

F I R S T ( S ) = { a , b , c , d } F O L L O W ( S ) = { e , # } F I R S T ( B ) = { b , c , d } F O L L O W ( B ) = { e , # } F I R S T ( C ) = { c , d } F O L L O W ( C ) = { e , # } FIRST(S) = \{a,b,c,d\} \quad FOLLOW(S) =\{e,\#\}\\ FIRST(B) = \{b,c,d\}\quad FOLLOW(B) =\{e,\#\}\\ FIRST(C) = \{c,d\}\quad FOLLOW(C) =\{e,\#\}\\ FIRST(S)={ a,b,c,d}FOLLOW(S)={ e,#}FIRST(B)={ b,c,d}FOLLOW(B)={ e,#}FIRST(C)={ c,d}FOLLOW(C)={ e,#}

不难发现,均满足条件②和条件③

符合LL(1)文法





4

对下面的文法

E x p r → − E x p r E x p r → ( E x p r ) ∣ V a r   E x p r T a i l E x p r T a i l → − E x p r ∣ ϵ V a r → i d   V a r T a i l V a r T a i l → ( E x p r ) ∣ ϵ Expr\rightarrow -Expr\\ Expr \rightarrow (Expr)| Var\ ExprTail\\ ExprTail \rightarrow -Expr|\epsilon\\ Var\rightarrow id\ VarTail\\ VarTail \rightarrow (Expr)|\epsilon ExprExprExpr(Expr)Var ExprTailExprTailExprϵVarid VarTailVarTail(Expr)ϵ

构造LL(1)分析表

重命名一下,太花里胡哨了
E → − E E → ( E ) ∣   V D D → − E ∣ ϵ V → i d   C C → ( E ) ∣ ϵ E\rightarrow -E\\ E \rightarrow (E)|\ VD\\ D \rightarrow -E|\epsilon\\ V\rightarrow id\ C\\ C \rightarrow (E)|\epsilon EEE(E) VDDEϵVid CC(E)ϵ

构造FIRST和FOLLOW
F I R S T ( E ) = { − , ( , i d } F O L L O W ( E ) = { # , ) } F I R S T ( V ) = { i d } F O L L O W ( V ) = { − , # , ) } F I R S T ( D ) = { − , ϵ } F O L L O W ( D ) = { # , ) } F I R S T ( C ) = { ( , ϵ } F O L L O W ( C ) = { − , # , ) } FIRST(E) = \{-,(,id\} \quad FOLLOW(E) = \{\# ,)\}\\ FIRST(V) = \{id\} \quad FOLLOW(V) = \{-,\# ,)\}\\ FIRST(D) = \{-,\epsilon\} \quad FOLLOW(D) = \{\# ,)\}\\ FIRST(C) = \{(,\epsilon\} \quad FOLLOW(C) = \{-,\# ,)\}\\ FIRST(E)={ ,(,id}FOLLOW(E)={ #,)}FIRST(V)={ id}FOLLOW(V)={ ,#,)}FIRST(D)={ ,ϵ}FOLLOW(D)={ #,)}FIRST(C)={(,ϵ}FOLLOW(C)={ ,#,)}

- id ( ) #
E E → − E E\rightarrow -E EE E → V D E\rightarrow VD EVD E → ( E ) E\rightarrow (E) E(E)
D D → − E D\rightarrow -E DE D → ϵ D\rightarrow \epsilon Dϵ D → ϵ D\rightarrow \epsilon Dϵ
V V → i d   C V\rightarrow id\ C Vid C
C C → ϵ C\rightarrow \epsilon Cϵ C → ( E ) C\rightarrow (E) C(E) C → ϵ C\rightarrow \epsilon Cϵ C → ϵ C\rightarrow \epsilon Cϵ

给出句子 id--id((id))的分析过程

分析栈 输入 产生式
#E id–id((id)) #
#DV id–id((id)) # E→VD
#DCid id–id((id)) # V→idC
#DC –id((id)) #
#D –id((id)) # C→ε
#E- –id((id)) # D→-E
#E -id((id)) #
#E- -id((id)) # E→-E
#E id((id)) #
#DV id((id)) # E→VD
#DCid id((id)) # V→idC
#DC ((id)) #
#D)E( ((id)) # C→(E)
#D)E (id)) #
#D))E( (id)) # E→(E)
#D))E id)) #
#D))DV id)) # E→VD
#D))DCid id)) # V→idC
#D))DC )) #
#D))D )) # C→ϵ
#D)) )) # D→ϵ
#D) ) #
#D #
# # D→ϵ

ps:麻了,这作业花了我六七个小时

猜你喜欢

转载自blog.csdn.net/JamSlade/article/details/129860243