> 文章列表 > 编译原理个人作业--第四章

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

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

构造FIRST和FOLLOW的大白话网站

第四章

1

考虑文法G1G_1G1:
S→a∣∧∣(T)T→T,S∣SS \\rightarrow a|\\land|(T) \\\\ T\\rightarrow T,S|SSa(T)TT,SS

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

  1. 类似于P→Pa∣bP\\rightarrow Pa|bPPab的形式,可以改写成
  • P→bP′P\\rightarrow bP^{'}PbP
  • P′→aP′∣ϵP^{'}\\rightarrow aP^{'}|\\epsilonPaPϵ
  1. 提公因子 P→Pa1∣...∣Pam∣b1∣...bn∣P\\rightarrow Pa_1|...|Pa_m|b_1|...b_n|PPa1∣...∣Pamb1∣...bn 转换为
  • P→b1P′∣...∣bnP′∣P\\rightarrow b_1P^{'}|...|b_nP^{'}|Pb1P∣...∣bnP
  • P′→a1P′∣...∣amP′∣ϵP^{'}\\rightarrow a_1P^{'}|...|a_mP^{'}|\\epsilonPa1P∣...∣amPϵ

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

1. 消除左递归

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

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

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

2.递归下降子程序

详见原书 p74

procedure S;
beginif (sym = 'a') or (sym = '^')then advancce;else if sym = '('then beginadvance; Tif sym = ')'then advanceelse errorendelse error;
endprocedure T;
beginS;A
endprocedure A;
beginif sym = ','then beginadvance;S;Aendelse error
end

根据74页的定义

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

根据原文

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

知识点

证明文法为LL(1)

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

构造分析表M算法

首先需要构造FISRT集

  • X∈VTX\\in V_TXVT,则 FIRST(X)={X}FIRST(X) = \\{X\\}FIRST(X)={X}
  • X∈VN∧X→a...X\\in V_N \\land X\\rightarrow a...XVNXa..., 把a放入 FIRST(X)FIRST(X)FIRST(X)
    • X→ϵX\\rightarrow \\epsilonXϵϵ\\epsilonϵ也放入FIRST(X)FIRST(X)FIRST(X)
  • X→Y...∧Y∈VNX\\rightarrow Y... \\land Y\\in V_NXY...YVN, 将FIRST(Y)−ϵFIRST(Y) - \\epsilonFIRST(Y)ϵ 的元素加入 FIRST(X)FIRST(X)FIRST(X)
    • X→Y1Y2...Yk...∧Y1,...,Yi−1非终结符∧对于任何j(1≤j≤i−1),FIRST(Yj)含有ϵX\\rightarrow Y_1Y_2...Y_k... \\land Y_1,...,Y_{i-1}非终结符\\land 对于任何j(1\\le j \\le i - 1), FIRST(Y_j)含有\\epsilonXY1Y2...Yk...Y1,...,Yi1非终结符对于任何j(1ji1),FIRST(Yj)含有ϵ, 则把FIRST(Yi)−ϵFIRST(Y_i)-\\epsilonFIRST(Yi)ϵ加入FIRST(X)中FIRST(X)中FIRST(X)
    • 特别的,若所有的FIRST(Yj)都含有ϵ,j=1,2,...,kFIRST(Y_j)都含有\\epsilon, j = 1,2,..., kFIRST(Yj)都含有ϵ,j=1,2,...,k, 把ϵ\\epsilonϵ 加入FIRST(X)FIRST(X)FIRST(X)

然后构造FOLLOW集

  • 对于文法开始符号SSS,放置#FOLLOW(S)FOLLOW(S)FOLLOW(S)
  • A→αBβA\\rightarrow \\alpha B\\betaAα,   把FIRST(β)−ϵFIRST(\\beta) - \\epsilonFIRST(β)ϵ 放入 FOLLOW(B)FOLLOW(B)FOLLOW(B)
  • A→αBA\\rightarrow \\alpha BAαB,    把FOLLOW(A)FOLLOW(A)FOLLOW(A)放入FOLLOW(B)FOLLOW(B)FOLLOW(B)
  • A→αBβ∧β⇒ϵA\\rightarrow \\alpha B\\beta \\land \\beta \\Rightarrow\\epsilonAαβϵ (也就是说ϵ∈FIRST(β)\\epsilon \\in FIRST(\\beta)ϵFIRST(β)),   把FOLLOW(A)FOLLOW(A)FOLLOW(A)放入FOLLOW(B)FOLLOW(B)FOLLOW(B)

最后构造M

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

解题过程

① 构造FIRST

首先考虑

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

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

FIRST(S)={a,∧,(}FIRST(S) = \\{a,\\land, (\\}FIRST(S)={a,,(}

考虑

T→SAT\\rightarrow SATSA

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

FIRST(T)={a,∧,(}FIRST(T) = \\{a,\\land, (\\}FIRST(T)={a,,(}

考虑

A→,SA∣ϵA\\rightarrow ,SA|\\epsilonA,SAϵ

FIRST(A)={,,ϵ}FIRST(A) = \\{, , \\epsilon\\}FIRST(A)={,ϵ}

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

首先考虑

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

  • 根据规则1,需要存#FOLLOW(S)FOLLOW(S)FOLLOW(S)
  • 根据规则2,需要将FIRST())−ϵFIRST())-\\epsilonFIRST()ϵ的元素放进去 FOLLOW(T)FOLLOW(T)FOLLOW(T)

于是第一步我们有

FOLLOW(S)={#}FOLLOW(T)={)}FOLLOW(S) = \\{\\#\\}\\\\ FOLLOW(T) = \\{)\\} FOLLOW(S)={#}FOLLOW(T)={)}

考虑

T→SAT\\rightarrow SATSA

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

得到

FOLLOW(S)={#}FOLLOW(T)={)}FOLLOW(A)={)}FOLLOW(S) = \\{\\#\\}\\\\ FOLLOW(T) = \\{)\\}\\\\ FOLLOW(A) = \\{)\\} FOLLOW(S)={#}FOLLOW(T)={)}FOLLOW(A)={)}

考虑

A→,SA∣ϵA\\rightarrow ,SA|\\epsilonA,SAϵ

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

得到

FOLLOW(S)={,,),#}FOLLOW(T)={)}FOLLOW(A)={)}FOLLOW(S) = \\{,, ),\\#\\}\\\\ FOLLOW(T) = \\{)\\}\\\\ FOLLOW(A) = \\{)\\} FOLLOW(S)={,),#}FOLLOW(T)={)}FOLLOW(A)={)}

③ 构造M

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

FIRST(S)={a,∧,(}FIRST(T)={a,∧,(}FIRST(A)={,,ϵ}FOLLOW(S)={,,),#}FOLLOW(T)={)}FOLLOW(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

首先按照 FIRST(S)FIRST(S)FIRST(S) 我们有

aaa ∧\\land ((( ))) ,,, #\\##
SSS S→aS\\rightarrow aSa S→∧S\\rightarrow \\landS S→(T)S\\rightarrow (T)S(T)

然后按照 FIRST(T)FIRST(T)FIRST(T) 我们有

aaa ∧\\land ((( ))) ,,, #\\##
SSS S→aS\\rightarrow aSa S→∧S\\rightarrow \\landS S→(T)S\\rightarrow (T)S(T)
TTT T→SAT\\rightarrow SATSA T→SAT\\rightarrow SATSA T→SAT\\rightarrow SATSA

根据FIRST(A)FIRST(A)FIRST(A)

aaa ∧\\land ((( ))) ,,, #\\##
SSS S→aS\\rightarrow aSa S→∧S\\rightarrow \\landS S→(T)S\\rightarrow (T)S(T)
TTT T→SAT\\rightarrow SATSA T→SAT\\rightarrow SATSA T→SAT\\rightarrow SATSA
AAA A→ϵA\\rightarrow \\epsilonAϵ A→,SAA\\rightarrow ,SAA,SA

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

  • ϵ∈FIRST(A)\\epsilon \\in FIRST(A)ϵFIRST(A),对∀b∈FOLLOW(A)\\forall b\\in FOLLOW(A)bFOLLOW(A)A→αA\\rightarrow\\alphaAα 放入M[A,b]中

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

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

2

考虑文法G:

E→TE′E′→+E∣ϵT→FT′T′→T∣ϵF→PF′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

FIRST(E)FIRST(E′)={+,ϵ}FIRST(T)FIRST(T′)={ϵ}FIRST(F)FIRST(F′)={∗,ϵ}FIRST(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)

FIRST(E)={(,a,b,∧}FIRST(E′)={+,ϵ}FIRST(T)={(,a,b,∧}FIRST(T′)={(,a,b,∧,ϵ}FIRST(F)={(,a,b,∧}FIRST(F′)={∗,ϵ}FIRST(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)中;

FOLLOW(E)={#,)}FOLLOW(E′)={#,)}FOLLOW(T)={#,),+}FOLLOW(T′)={#,),+}FOLLOW(F)={(,a,b,∧,#,),+}FOLLOW(F′)={(,a,b,∧,#,),+}FOLLOW(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→a1∣...∣anFirst(ai)∩First(aj)=∅对于A\\rightarrow a_1|...|a_n\\quad First(a_i)\\cap First(a_j) = \\empty对于Aa1∣...∣anFirst(ai)First(aj)=
  3. 文法非终结符A,若他候选符集包含ϵ\\epsilonϵFIRST(A)∩FOLLOW(A)=∅FIRST(A)\\cap FOLLOW(A) = \\emptyFIRST(A)FOLLOW(A)=

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

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

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

FIRST(+E)={+}∩FIRST(ϵ)=∅FIRST(T)={(,a,b,∧}∩FIRST(ϵ)=∅FIRST(∗F′)={∗}∩FIRST(ϵ)=∅FIRST((E))={(},与a,b,∧构成的FIRST集两两不相交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ϵ的为第二,第四,第六行。显然

FIRST(E′)∩FOLLOW(E′)=∅FIRST(T′)∩FOLLOW(T′)=∅FIRST(F′)∩FOLLOW(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. 对文法 GGG 产生式 A→αA\\rightarrow \\alphaAα 进行(2)(3)操作
  2. 终结符 a∈FIRST(α)a\\in FIRST(\\alpha)aFIRST(α) 加入 M[A,a]M[A, a]M[A,a]
  3. ϵ∈FIRST(α)\\epsilon \\in FIRST(\\alpha)ϵFIRST(α),则对任何b∈FOLLOW(A)b \\in FOLLOW(A)bFOLLOW(A),把A→αA\\rightarrow \\alphaAα 放入 M[A,b]M[A, b]M[A,b]
  4. 没有定义则出错

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

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

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

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

根据规则3

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

最终得到如下分析表

+ * a b #
E E→TE′E\\rightarrow TE^{'}ETE E→TE′E\\rightarrow TE^{'}ETE E→TE′E\\rightarrow TE^{'}ETE E→TE′E\\rightarrow TE^{'}ETE
E’ E′→+EE^{'}\\rightarrow +EE+E E′→ϵE^{'}\\rightarrow \\epsilonEϵ E′→ϵE^{'}\\rightarrow \\epsilonEϵ
T T→FT′T\\rightarrow FT^{'}TFT T→FT′T\\rightarrow FT^{'}TFT T→FT′T\\rightarrow FT^{'}TFT T→FT′T\\rightarrow FT^{'}TFT
T’ T′→ϵT^{'}\\rightarrow \\epsilonTϵ T′→TT^{'}\\rightarrow TTT T′→ϵT^{'}\\rightarrow \\epsilonTϵ T′→TT^{'}\\rightarrow TTT T′→TT^{'}\\rightarrow TTT T′→TT^{'}\\rightarrow TTT T′→ϵT^{'}\\rightarrow \\epsilonTϵ
F F→PF′F\\rightarrow PF^{'}FPF F→PF′F\\rightarrow PF^{'}FPF F→PF′F\\rightarrow PF^{'}FPF F→PF′F\\rightarrow PF^{'}FPF
F’ F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→∗F′F^{'}\\rightarrow *F^{'}FF F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→ϵF^{'}\\rightarrow \\epsilonFϵ F′→ϵF^{'}\\rightarrow \\epsilonFϵ
P P→(E)P\\rightarrow (E)P(E) P→aP\\rightarrow aPa P→bP\\rightarrow bPb P→∧P\\rightarrow \\landP

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

procedure E:
beginif sym = '(' or sym = 'a'or sym = 'B'or sym = '^'then beginT;E’endelseerror
endprocedure E’:
beginif sym = '+'then beginadvance;Eendelse if sym <> ')' and sym <> '#'then error
endprocedure T:
beginif sym = '(' or sym = 'a'or sym = 'B'or sym = '^'then beginF;T’endelseerror
endprocedure T’:
beginif sym = '(' or sym = 'a'or sym = 'B'or sym = '^'then beginT;endelse if sym = '*'error
endprocedure F:
beginif sym = '(' or sym = 'a'or sym = 'B'or sym = '^'then beginP;F’endelseerror
endprocedure F’:
beginif sym = '*' then beginadvance;F’end
endprocedure P:
beginif  sym = 'a'or sym = 'B'or sym = '^'then advanceelse if sym = '(' then beginadvance;E;if sym = ')'then advanceelseerrorendelseerror
end

3

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

(1)

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

不含左递归

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

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

先求出相关的FIRST和FOLLOW集合
FIRST(S)={a,b,c}FOLLOW(S)={#}FIRST(A)={a,ϵ}FOLLOW(A)={b,c}FIRST(B)={b,ϵ}FOLLOW(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→AbA→a∣B∣ϵB→b∣ϵS\\rightarrow Ab\\\\ A\\rightarrow a|B|\\epsilon\\\\ B\\rightarrow b|\\epsilon SAbAaBϵBbϵ

不含左递归

FIRST(S)={a,b}FOLLOW(S)={#}FIRST(A)={a,b,ϵ}FOLLOW(A)={b}FIRST(B)={b,ϵ}FOLLOW(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)

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

不符合LL(1)

(3)

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

不含左递归

FIRST(S)={a,b,ϵ}FOLLOW(S)={#}FIRST(A)={a,ϵ}FOLLOW(A)={b,#}FIRST(B)={a,b,ϵ}FOLLOW(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,#}

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

FIRST(B)∩FOLLOW(B)={a,b}≠∅FIRST(B)\\cap FOLLOW(B) = \\{a,b\\} \\neq \\emptyFIRST(B)FOLLOW(B)={a,b}=

不满足LL(1)

(4)

S→aSe∣BB→bBe∣CC→cCe∣dS\\rightarrow aSe|B\\\\ B\\rightarrow bBe|C\\\\ C\\rightarrow cCe|d SaSeBBbBeCCcCed

不含左递归

FIRST(S)={a,b,c,d}FOLLOW(S)={e,#}FIRST(B)={b,c,d}FOLLOW(B)={e,#}FIRST(C)={c,d}FOLLOW(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

对下面的文法

Expr→−ExprExpr→(Expr)∣VarExprTailExprTail→−Expr∣ϵVar→idVarTailVarTail→(Expr)∣ϵ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→−EE→(E)∣VDD→−E∣ϵV→idCC→(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
FIRST(E)={−,(,id}FOLLOW(E)={#,)}FIRST(V)={id}FOLLOW(V)={−,#,)}FIRST(D)={−,ϵ}FOLLOW(D)={#,)}FIRST(C)={(,ϵ}FOLLOW(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→−EE\\rightarrow -EEE E→VDE\\rightarrow VDEVD E→(E)E\\rightarrow (E)E(E)
D D→−ED\\rightarrow -EDE D→ϵD\\rightarrow \\epsilonDϵ D→ϵD\\rightarrow \\epsilonDϵ
V V→idCV\\rightarrow id\\ CVid C
C C→ϵC\\rightarrow \\epsilonCϵ C→(E)C\\rightarrow (E)C(E) C→ϵC\\rightarrow \\epsilonCϵ C→ϵC\\rightarrow \\epsilonCϵ

给出句子 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:麻了,这作业花了我六七个小时

藏瓷网