编译原理个人作业--第四章
构造FIRST和FOLLOW的大白话网站
第四章
1
考虑文法G1G_1G1:
S→a∣∧∣(T)T→T,S∣SS \\rightarrow a|\\land|(T) \\\\ T\\rightarrow T,S|SS→a∣∧∣(T)T→T,S∣S
先复习左递归如何消除 原书p69页
- 类似于P→Pa∣bP\\rightarrow Pa|bP→Pa∣b的形式,可以改写成
- P→bP′P\\rightarrow bP^{'}P→bP′
- P′→aP′∣ϵP^{'}\\rightarrow aP^{'}|\\epsilonP′→aP′∣ϵ
- 提公因子 P→Pa1∣...∣Pam∣b1∣...bn∣P\\rightarrow Pa_1|...|Pa_m|b_1|...b_n|P→Pa1∣...∣Pam∣b1∣...bn∣ 转换为
- P→b1P′∣...∣bnP′∣P\\rightarrow b_1P^{'}|...|b_nP^{'}|P→b1P′∣...∣bnP′∣
- P′→a1P′∣...∣amP′∣ϵP^{'}\\rightarrow a_1P^{'}|...|a_mP^{'}|\\epsilonP′→a1P′∣...∣amP′∣ϵ
(1) 消除G1G_1G1左递归。并对每个非终结符,写出不带回溯的递归子程序
1. 消除左递归
分析:不难发现,左递归只在第二条地推中出现,应修改第二条
- 将b后面塞上一个新非终结符,删去原有的左递归部分
- 新非终结符可以递推出
左递归右半部分 + 新非终结符
S→a∣∧∣(T)T→SAA→,SA∣ϵS \\rightarrow a|\\land|(T) \\\\ T\\rightarrow SA\\\\ A\\rightarrow ,SA|\\epsilonS→a∣∧∣(T)T→SAA→,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_TX∈VT,则 FIRST(X)={X}FIRST(X) = \\{X\\}FIRST(X)={X}
- 若X∈VN∧X→a...X\\in V_N \\land X\\rightarrow a...X∈VN∧X→a..., 把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_NX→Y...∧Y∈VN, 将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)含有\\epsilonX→Y1Y2...Yk...∧Y1,...,Yi−1非终结符∧对于任何j(1≤j≤i−1),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→αBβ, 把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→αBβ∧β⇒ϵ (也就是说ϵ∈FIRST(β)\\epsilon \\in FIRST(\\beta)ϵ∈FIRST(β)), 把FOLLOW(A)FOLLOW(A)FOLLOW(A)放入FOLLOW(B)FOLLOW(B)FOLLOW(B)
最后构造M
- 对文法 GGG 产生式 A→αA\\rightarrow \\alphaA→α 进行(2)(3)操作
- 终结符 a∈FIRST(α)a\\in FIRST(\\alpha)a∈FIRST(α) 加入 M[A,a]M[A, a]M[A,a]中
- 若ϵ∈FIRST(α)\\epsilon \\in FIRST(\\alpha)ϵ∈FIRST(α),则对任何b∈FOLLOW(A)b \\in FOLLOW(A)b∈FOLLOW(A),把A→αA\\rightarrow \\alphaA→α 放入 M[A,b]M[A, b]M[A,b]中
- 没有定义则出错
解题过程
① 构造FIRST
首先考虑
S→a∣∧∣(T)S \\rightarrow a|\\land|(T)S→a∣∧∣(T)
不难发现,a,^,(
都出现在了产生式右端的最左端,
所以有
FIRST(S)={a,∧,(}FIRST(S) = \\{a,\\land, (\\}FIRST(S)={a,∧,(}
考虑
T→SAT\\rightarrow SAT→SA
根据构造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)S→a∣∧∣(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 SAT→SA
- 根据规则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|\\epsilonS→a∣∧∣(T)T→SAA→,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 aS→a | S→∧S\\rightarrow \\landS→∧ | S→(T)S\\rightarrow (T)S→(T) |
然后按照 FIRST(T)FIRST(T)FIRST(T) 我们有
aaa | ∧\\land∧ | ((( | ))) | ,,, | #\\## | |
---|---|---|---|---|---|---|
SSS | S→aS\\rightarrow aS→a | S→∧S\\rightarrow \\landS→∧ | S→(T)S\\rightarrow (T)S→(T) | |||
TTT | T→SAT\\rightarrow SAT→SA | T→SAT\\rightarrow SAT→SA | T→SAT\\rightarrow SAT→SA |
根据FIRST(A)FIRST(A)FIRST(A)
aaa | ∧\\land∧ | ((( | ))) | ,,, | #\\## | |
---|---|---|---|---|---|---|
SSS | S→aS\\rightarrow aS→a | S→∧S\\rightarrow \\landS→∧ | S→(T)S\\rightarrow (T)S→(T) | |||
TTT | T→SAT\\rightarrow SAT→SA | T→SAT\\rightarrow SAT→SA | T→SAT\\rightarrow SAT→SA | |||
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)∀b∈FOLLOW(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 E→TE′E′→+E∣ϵT→FT′T′→T∣ϵF→PF′F′→∗F′∣ϵP→(E)∣a∣b∣∧
(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的证明
- 文法无左递归
- 对文法非终结符A产生的候选符集合两两不相交 对于A→a1∣...∣anFirst(ai)∩First(aj)=∅对于A\\rightarrow a_1|...|a_n\\quad First(a_i)\\cap First(a_j) = \\empty对于A→a1∣...∣anFirst(ai)∩First(aj)=∅
- 文法非终结符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
- 对文法 GGG 产生式 A→αA\\rightarrow \\alphaA→α 进行(2)(3)操作
- 终结符 a∈FIRST(α)a\\in FIRST(\\alpha)a∈FIRST(α) 加入 M[A,a]M[A, a]M[A,a]中
- 若ϵ∈FIRST(α)\\epsilon \\in FIRST(\\alpha)ϵ∈FIRST(α),则对任何b∈FOLLOW(A)b \\in FOLLOW(A)b∈FOLLOW(A),把A→αA\\rightarrow \\alphaA→α 放入 M[A,b]M[A, b]M[A,b]中
- 没有定义则出错
对 E→TE′E\\rightarrow TE^{'}E→TE′ , 我们根据规则2
+ | * | ( | ) | a | b | ⋀ | # | |
---|---|---|---|---|---|---|---|---|
E | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ |
对 E′→+E∣ϵE^{'}\\rightarrow +E|\\epsilonE′→+E∣ϵ , 我们根据规则2
+ | * | ( | ) | a | b | ⋀ | # | |
---|---|---|---|---|---|---|---|---|
E | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | ||||
E’ | E′→+EE^{'}\\rightarrow +EE′→+E |
根据规则3
+ | * | ( | ) | a | b | ⋀ | # | |
---|---|---|---|---|---|---|---|---|
E | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | ||||
E’ | E′→+EE^{'}\\rightarrow +EE′→+E | E′→ϵE^{'}\\rightarrow \\epsilonE′→ϵ | E′→ϵE^{'}\\rightarrow \\epsilonE′→ϵ |
最终得到如下分析表
+ | * | ( | ) | a | b | ⋀ | # | |
---|---|---|---|---|---|---|---|---|
E | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | E→TE′E\\rightarrow TE^{'}E→TE′ | ||||
E’ | E′→+EE^{'}\\rightarrow +EE′→+E | E′→ϵE^{'}\\rightarrow \\epsilonE′→ϵ | E′→ϵE^{'}\\rightarrow \\epsilonE′→ϵ | |||||
T | T→FT′T\\rightarrow FT^{'}T→FT′ | T→FT′T\\rightarrow FT^{'}T→FT′ | T→FT′T\\rightarrow FT^{'}T→FT′ | T→FT′T\\rightarrow FT^{'}T→FT′ | ||||
T’ | T′→ϵT^{'}\\rightarrow \\epsilonT′→ϵ | T′→TT^{'}\\rightarrow TT′→T | T′→ϵT^{'}\\rightarrow \\epsilonT′→ϵ | T′→TT^{'}\\rightarrow TT′→T | T′→TT^{'}\\rightarrow TT′→T | T′→TT^{'}\\rightarrow TT′→T | T′→ϵT^{'}\\rightarrow \\epsilonT′→ϵ | |
F | F→PF′F\\rightarrow PF^{'}F→PF′ | F→PF′F\\rightarrow PF^{'}F→PF′ | F→PF′F\\rightarrow PF^{'}F→PF′ | F→PF′F\\rightarrow PF^{'}F→PF′ | ||||
F’ | F′→ϵF^{'}\\rightarrow \\epsilonF′→ϵ | F′→∗F′F^{'}\\rightarrow *F^{'}F′→∗F′ | 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 aP→a | P→bP\\rightarrow bP→b | 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\\\\ S→ABcA→a∣ϵB→b∣ϵ
① 不含左递归
② 显然第二第三行的候选终结首符集两两不相交
③ 由于第二第三行推导式右边含 ϵ\\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 S→AbA→a∣B∣ϵB→b∣ϵ
① 不含左递归
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 S→ABBAA→a∣ϵB→b∣ϵ
① 不含左递归
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 S→aSe∣BB→bBe∣CC→cCe∣d
① 不含左递归
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 Expr→−ExprExpr→(Expr)∣Var ExprTailExprTail→−Expr∣ϵVar→id 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 E→−EE→(E)∣ VDD→−E∣ϵV→id 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 -EE→−E | E→VDE\\rightarrow VDE→VD | E→(E)E\\rightarrow (E)E→(E) | ||
D | D→−ED\\rightarrow -ED→−E | D→ϵD\\rightarrow \\epsilonD→ϵ | D→ϵD\\rightarrow \\epsilonD→ϵ | ||
V | V→idCV\\rightarrow id\\ CV→id 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:麻了,这作业花了我六七个小时