编译原理分知识点习题 自上而下语法分析
编译原理 自上而下分析
本章在编译程序中的地位表词法分析器语法分析器源程序单词符号出2• 上下文无关文法的定义:G G=(V T V N S P)– V T ( )– V N ( ) V T ∩ V N =∅ – S S ∈V N– P ( )P →α P ∈V N α ∈ (V T ∪ V N )*– S复习• + *G= {i + * ( )} {E} E PPE → iE → E+EE → E*EE → (E)(i+i)E⇒(E)⇒(E+E)⇒(i+E)⇒(i+i)34},|{)(*TV S G L ∈⇒=+αααq 定义:假定G是一个文法,S 是它的开始符号。
如果Sα ,则α称是一个句型。
仅含终结符号的句型是一个句子。
文法G所产生的句子的全体是一个语言,将它记为 L(G)。
• α1 αn α1 αn+ ⇒α1 αn α1 0 αn* ⇒ 所以 : α1 αn 即 α1=αn , α1 αn* ⇒ + ⇒ * ⇒第4章 自上而下语法分析• 消除文法左递归,消除回溯,计算FIRST集、FOLLOW集,LL(1)分析条件, LL(1)文法的概念,预测分析表的构造。
• :自上而下分析方法的基本思想, 自上而下分析的过程。
• 4.14.24.3 LL(1)4.4重点难点4.5*4.6 LL(1)564.1 语法分析器的功能• 是在词法分析识别出单词符号串的基础上,分析判断程序的 是否符合语法规则。
• 是编译过程的核心部分。
• 有自上而下和自下而上两类。
两种方法反映了两种语法树的构造过程。
74.1 语法分析器的功能• " " 推导。
也就是从文法的开始符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串.• “归约”也就是从输入符号串开始,以它做为语法树的结果,自底向上地构造语法树.注:这里所说的输入符号串指词法分析所识别的单词。
84.2 自上而下分析面临的问题• – . – .• 例4.1文法:⑴ S→xAy⑵ A→** ⑶ A→*输入串 α=x*y,分析α是否该文法的句子?指示器IP指向 语法树 最左推导 说明x*y S S, x序号 ip 指向 语法树 最左推导 说明S x*yx A y A →** AS ⇒xAy ⇒x**y* *x*y* , ip S序号 ip 指向 语法树 最左推导 说明x*y Sx A yA →* AS ⇒xAy ⇒x*y * x*y * , ip Sx A y12自上而下分析• 从文法的开始符号出发,向下推导,试图推出句子,匹配输入符号串,寻找输入串的最左推导,并按与最左推导相对应的顺序,自上而下从左到右地建立输入串的语法分析树。
编译原理笔记9 自上而下语法分析-无回溯的自顶向下分析技术
1)不带回溯的自上而下分析算法
a) 消除左递归。
i. 什么是左递归:
ii. 消除直接左递归,消除间接左递归。
b) 消除直接左递归。
c) 消除左递归算法。
注:1)若非终结符排列顺序不同,改写后的文法也不同,但它们是等价的。
d) 消除回溯
i. 产生回溯的原因:进行推导时,若产生式存在多个候选式,选择哪个
候选式进行推导存在不确定性。
ii. 消除回溯的基本原则:对文法的任何非终结符,若能根据当前读头下的符号,准确的选择一个候选式进行推导,那么回溯就可以消除。
注:之所以会产生回溯是因为在推导匹配的过程中存在虚假匹配。
iii. 消除回溯的方法:预测与提左因子
iv. 根据读头下符号选择候选式,使其第一个符号与读头下符号相同,或该候选式可推导出的第一个符号与读头下符号相同。
这相当于向前看了一个符号,所以称为预测。
注:使用了预测之后,选择候选式不再是盲目的了,所以也就无需回溯。
v. 求候选式的终结首符集。
vi. 采用预测方法后PDA 的运行。
vii. 提取公共左因子。
《编译原理》第5章自上而下语法分析
编译原理武汉大学计算机学院编译原理课程组第5章自上而下语法分析·基本思想·存在的问题·解决方法·LL(1)方法·递归子程序法5.0 语法分析的功能及基本思想依据语法规则,逐一分析词法分析时得到的单词,把单词串分解成各类语法单位,即确定它们是怎样组成说明和语句,以及说明和语句又是怎样组成程序的。
分析时如发现有不合语法规则的地方,便将出错的位置及出错性质打印报告给程序员;如无语法错误,则用另一种中间形式给出正确的语法结构,供下一阶段分析使用。
1. 语法分析的功能5.0 语法分析的功能及基本思想2.自上而下语法分析的基本思想从识别符号出发,不断建立直接推导,试图构造一个最左推导序列,最终由它推导出与输入符号串相同的符号串。
从语法树的角度看,自顶向下分析过程将以识别符号为根结点,试图向下构造一棵语法树,其末端结点符号串正好与输入符号串相同。
相应于高级语言的编译过程,自上而下语法分析就是从该高级语言文法的开始符号——<程序>出发,试图推导得到该文法的句子——源程序或与其等价的单词串。
3. 自上而下语法分析遇到的问题5.0 语法分析的功能及基本思想在分析的过程中,匹配失败后,必须退回到出错点,选择其它可能的产生式重新推导,这个过程称为回溯。
如果文法中存在如下形式的产生式A →α1|α2|…|αn那么在自上而下的语法分析过程中,当要对A 展开时,应按哪一个后选式展开呢?即如何确定替换A 的αi 。
如果选择错误,将导致回溯。
5.0 语法分析的功能及基本思想3. 自上而下语法分析遇到的问题当文法中出现左递归时(存在非终结符号U,对于它有+⇒U→U…或U U…),会使分析过程陷入无限循环。
例如对文法G[S]:S→ABA→bB|AaB→Sb|a5.0 语法分析的功能及基本思想4.自上而下语法分析中问题的解决方法·避免回溯·消除左递归5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示[x]——x可以出现零次或一次{x}——x可以出现零次到多次x(y|z)——等价于xy或xz5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示•引进新的非终结符号,将左递归改写为右递归。
第四章 语法分析——自上而下分析
FOLLOW(Y) =FOLLOE(X)=end
则有LL(1)表:
begin
d
:
end s #
P begind : X end
X
d:X
sY
Y
:sY
第四章 语法分析--自上而下分析
[例3]:给出语言L={1na0n1ma0m|n>0, m>=0} 的LL(1)文 法G[S]并说明其理由。 解:观察句子,发现可分成两部分 1na0n 和 1ma0m两部 分中符号的个数n和m没有制约关系。则可改造成下列 文法:
T FT’
T’ *FT’|
F (E)| i
我们构造每个非终结符的FIRST和FOLLOW集合
解:FIRST(E) = { (, i }
FOLLOW(E’) = {+, }
FOLLOW(E’) = { ), #}
FIRST(T) = {(, i }
FOLLOW(T) = {+, ), # }
第四章 语法分析--自上而下分析
例题与习题解答
[例1]试构造与下列文法G[S]等价的无左递归文法。
G[S]: SSa|Nb|c
(1)
N Sd|Ne|f
(2)
对于(1)我们引入新非终结符S’
则: S NbS’ |cS’
[1]
S’ aS’|
[2]
将 S代入 (2)
N Ne |NbS’d |cS’d |f
5.1 自下而上分析基本问题 其基本问题包括下列问题:
5.1.1归约 5.1.2 规范归约简述
在这一部分应掌握短语和直接短语两个重要
概念
5.1.3 符号栈的使用与语法树的表示
第四章 语法分析--自上而下分析
编译原理第4章语法分析自上而下
(e) 当(d)中所有Yi * ε,(i=1,2,…n),则 FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
一 . 自上而下语法分析方法
给定文法G和源程序串$。从G的开始符 号S出发,通过反复使用产生式对句型中的 非终结符进行替换(推导),逐步推导出$ 。
是一种产生的方法,面向目标的方法。 分析的主旨是选择产生式的合适的侯选 式进行推导,逐步使推导结果与$匹配。
Ch4 语法分析 4.1 语法分析程序综述 4.1.2 语法分析的方法
计算Select集:
B ε | aD C AD | b
每个产生式的Select集合计算为:D aS | c
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
Select(S bC)= first (bC)={b}
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#}
A ε | b B ε | aD C AD | b D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}
➢求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
✓若符号串α∈V*,α=X1 X2 … Xn,当X1不能
∪{ε}
ε*,则置 ∈
编译原理第章自上而下语法分析
3
对输入符号的依赖
自上而下的语法分析需要在分析过程中不断查看 输入符号,因此对输入符号的依赖较强。
编译原理的发展趋势与挑战
静态代码分析与优化
通过静态代码分析技术,编译器可以在编译时检测出更多的潜在错误,并进行 相应的优化。
非递归预测分析的基本思想
消除左递归
通过改写文法规则,消除直接和间接左递归,使得分析过程能够 顺利进行。
构造预测分析表
根据文法规则和非终结符的FOLLOW集,构造预测分析表,用于 指导分析过程。
栈和输入符号的同步处理
使用栈保存分析过程中的信息,并根据输入符号和栈顶信息进行同 步处理,实现语法分析。
非递归预测分析表的构造
介绍LL(1)文法的定义和判别方法,包括FIRST集和 FOLLOW集的构造。
递归下降分析算法设计
介绍递归下降分析算法的设计方法,包括递归子程序的 编写和错误处理机制。
02
CATALOGUE
语法分析基础
语法分析器的作用
识别语法错误
语法分析器能够检查源代码是否 符合语言的语法规则,识别出语 法错误并提供相应的错误信息。
在推导过程中,如果遇到非终 结符,则根据相应的产生式规 则进行替换,直到最终得到终
结符序列为止。
递归下降分析器的构造
分析函数根据当前输入符号和文 法规则判断应该执行的操作。
如果当前输入符号与文法规则中的某 个终结符相匹配,则消耗掉该输入符 号,并继续分析下一个输入符号。
如果当前输入符号与文法规则中 的某个非终结符相匹配,则调用 相应的分析函数进行递归分析。
预测分析算法的实现
初始化分析栈
编译原理语法分析_自上而下__LL(1)文法的判别
Y
N
计算FOLLOW集
(a) 设S为文法中开始符号, 把 # 加入FOLLOW(S)中 (b) 若 A→αBβ 是一个产生式, 则把 FIRST(β)\{ε} 加入 FOLLOW(B) 中 (c) 若 A→αB 是一个产生式, 或 A→αBβ 是一个产生式,且β可推出ε, 即ε∈FIRST(β) , 则把 FOLLOW(A) 也加入 FOLLOW(B) 中 (d) 反复使用(b)直到每个非终结符的FOLLOW集 不再增大为止。
推出ε FIRST集 FOLLOW集 E N (,i ),# E' Y + ,ε ),# T N (,i +,),# T' Y * ,ε +,),# F N (,i *,+,),#
计算SELECT集
给定上下文无关文法的产生式A→α, A∈VN, α∈V*, * ε, • 若α SELECT(A→α) = FIRST(α) * ε, • 若α SELECT(A→α) = (FIRST(α)-{ε})∪ FOLLOW(A)
G': E → TE' E'→ +TE' E'→ ε T → FT' T'→ *FT' T'→ ε F → (E) F→i 推出ε N Y N Y N
E E' T T' F
求出能推出ε的非终结符 - 算法描述
建立一个一维数组X[ ],用以记录非终结符能否 推出ε。 ① 将数组X[ ]中对应每一非终结符的标记置初值 为“未定”。
♨ LL(1)文法的判别
左递归和左公因子 * ε的非终结符 求出能 求First集 求Follow集 LL(1)判别
编译原理-自上而下的语法分析
高效性
由于从文法的最顶端开始分析, 一旦发现不匹配,就可以立即终 止当前分支的搜索,避免不必要 的计算,提高了编译器的效率。
易于处理左递归文
法
自上而下的分析方法可以很方便 地处理含有左递归的文法,而左 递归是许多实际编程语言的重要 特征。
局限性
无法处理左边界问题
自上而下的分析方法在处理某些含有左边界的文法时可能 会遇到问题,因为这种方法会优先匹配最左边的符号,而 左边界问题需要从右往左匹配符号。
案例三
在编译器优化中,自上而下的语法分析被用 于识别和修改源代码中的冗余和低效的语法 成分。例如,在C编译器的实现中,自上而 下的语法分析可以用于优化循环结构,减少 不必要的循环次数,提高程序的执行效率。
自上而下的语法分析还可以用于代码生成和 代码生成器的实现。通过识别和解析源代码 中的语法成分,可以生成更高效、更安全的 机器代码或字节码,提高程序的执行效率和
安全性。
THANKS
感谢观看
详细描述:递归下降分析算法易于理解,每个产生式规 则对应一个函数,函数的实现相对简单明了。
详细描述:对于每个产生式规则,需要编写相应的递归 函数,可能会导致代码冗余。
移入-规约分析算法
总结词
基于栈的算法
详细描述
移入-规约分析算法是一种自上而下的语法分 析算法,它将目标语句从左到右依次读入, 并根据文法的产生式规则进行移入或规约操 作,直到找到目标语句的语法结构。
词法分析
词法分析是编译过程的第一步,也称为扫描或词法扫描。它的任务是从左 到右读取源代码,将其分解成一个个的记号或符号。
词法分析器通常使用正则表达式或有限自动机来识别和生成记号,这些记 号可以是关键字、标识符、运算符、标点符号等。
编译原理第三版 第五章 自下而上语法分析
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理语法分析_自上而下__分析过程-FirstFollowSelect
G1: S → pA |qB A → a | cA B → b | dB 输入串 pca G2: S → Ap | Bq A → a | cA B → b | dB 输入串 cap
FIRST 集
FIRST集 / 开始符号集 / 终结首符集
* a…, a∈VT} FIRST(α) = {a|α * ε, 则规定 ε∈FIRST(α) 若α
G: S→ AB A→aA |ε B→bA |ε
自上而下语法分析面临的问题
G: S → cAd A → a|ab 输入串 cabd
- 回溯 Backtrack S
c A d
S
c A d a b
a A→ α1 |α2 |…|αn 如何决定用哪个候选式替换A? 不确定分析: 带回溯 (试探) 确定分析 : 不带回溯
练习: 求 First 集
G: S → ABC A → aA |ε B → bB |b C → cC |c First(S) = { a, b }
First(A) = { a, ε }
First(B) = { b}
First(C) = { c}
例: 自上而下语法分析
G5: E → TE' E'→ +TE'|ε T → FT' T'→ *FT'|ε F → (E) | i 输入串 i+i
Select 集
SELECT集 选择集合
给定上下文无关文法的产生式A→α, * ε, • 若α SELECT(A→α) = FIRST(α) * ε, • 若α SELECT(A→α) = (FIRST(α)-{ε})∪FOLLOW(A)
自上而下的语法分析
非终结符
初值 第1次扫描 第2次扫描
M
未定
T
B
D
未定
是
未定
是
未定
是
是
SELECT(T→Ba)={d,e,b,a,ε} SELECT(T→ε) = {d,e,b,a,#} 这两者的交集不为 ∅ 。 故该文法不是 LL(1) 文法。
5.5.2 LL(1)分析一般过程
给定文法: S → aSbS|ε 。求符号串 ab 的 LL(1) 分析过程。
* FIRST(A)= {a|A = a…,且 a∈VT } >
求FIRST集合
G: M T B D
文法规则
→ TB → Ba|ε → Db|eT|ε → d|ε
第一遍 第二遍 第三遍
M T T B B B D D
→ TB → Ba →ε → Db → eT →ε →d →ε
F(M)={ } F(T)={ } F(T)={ε} F(B)={ } F(B)={e} F(B)={e,ε} F(D)={d} F(D)={d,ε}
G2[S]: S→Ap S→Bq A→cA A→a B→dB B→b FIRST(Ap) = { a,c } FIRST(Bq) = { b,d } FIRST(S) = FIRST(Ap) ∪FIRST(Bq) = { a,b,c,d }
SБайду номын сангаас
A p
G3[S]: S→aA S→d A→bAS A→ε
FOLLOW(B)=FOLLOW(B)∪{a}={#,a} FOLLOW(D)=FOLLOW(D)∪{b}={b} FOLLOW(T)=FOLLOW(T)∪FOLLOW(B)={d,e,b,#}∪{#,a} ={d,e,b,a,#}
编译原理第四章语法分析-自上而下分析
• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
编译原理-自上而下语法分析
递归下降分析程序构造 预测分析程序 LL(1)分析中的错误处理
4.3.1 不带回溯的自上而下分析算法
自上而下分析方法
不允许文法含有任何左递归 构造不带回溯的自上而下分析算法
消除文法的左递归性
找出克服回溯的充分必要条件
4.3.2 左递归的消除(一)
直接消除产生式中的左递归
4.1.1 语法分析器的功能
高级语言的语法结构
适合用上下文无关文法描述
语法分析器
任务:分析与判定程序的语法结构是否符合语法规则
工作本质:根据产生式识别输入串是否为一个句子
在编译器中的地位:核心部分
源程序
单词符号
词法分析器
取下一个单 词符号
语法分析器
语法分析树
编译器的 后继部分
那么,可以把这些规则改写成
A→A | 1 | 2 | … | m A→ 1 | 2 | … | n
经过反复提取左因子,就能够把每个非终结符(包括
新引进者)的所有候选首符集变成为两两不相交
4.3.3 消除回溯、提左因子(三)
例4.4:考察文法G:
S → iCtS | iCtSeS | a C→b
自上而下
从文法的开始符号出发,向下推导,推出句子
存在问题:带“回溯”
克服方法
不带回溯的递归子程序(递归下降)分析方法
自上而下分析的主旨
为输入串寻找一个最左推导 对任何输入串,试图用一切可能的办法,从文法开始
符号(根结点)出发,自上而下地为输入串建立一棵 语法树
4.2.2 回溯举例
4.3.3 回溯的消除(一)
为了消除回溯就必须保证
《编译原理》第6章自下而上语法分析
编译原理武汉大学计算机学院编译原理课程组自上而下语法分析·基本思想·存在的问题·解决方法·LL(1)方法·递归子程序法消除左递归FIRST集、FOLLOW集·LL(1)文法递归子程序的构造LL(1)分析表的构造6.1 自下而上语法分析1.自下而上语法分析的基本思想从输入的符号串开始,利用文法的产生式步步向上归约,试图归约到文法的识别符号。
如果从语法树的角度看,自下而上分析的过程是以输入符号串作为末端结点符号串,向着根结点的方向往上构造语法树,使识别符号正好是该语法树的根结点。
相应于高级语言的编译过程,自下而上语法分析就是从该高级语言文法的源程序或与其等价的单词串出发,试图归约得到该文法的开始符号——<程序>。
6.1 自下而上语法分析3.自下而上语法分析遇到的基本问题例如,对文法G[S]:S→aAcBeA→bA→AbB→d分析符号串abbcde。
1.短语、直接短语与句柄6.2 短语和句柄则称句型xuy 中的子串u 为句型xuy (相对于非终结符号U )的短语。
设有文法G[Z],w=xuy 是它的一个句型,如果有Z *⇒xUy +⇒且U u U ⇒u则称u为句型xuy的直接(简单)短语。
特别地,如果前述条件中U +⇒u为句型的最左直接(简单)短语称为句柄。
6.2 短语和句柄例:设有文法G[S]:S→ABA→Aa|bBB→a|Sb请给出句型baabaab的所有短语、直接短语和句柄。
6.2 短语和句柄2.短语、简单(直接)短语、句柄与语法树的关系语法树子树的末端结点符号串即是语法树所描述句型(相对于子树的根)的短语;简单子树(只有父子两代)的末端结点符号串即是直接短语。
最左简单子树的末端结点符号串即是句柄。
6.2 短语和句柄例:设有文法G[S]:S→ABA→Aa|bBB→a|Sb请给出句型baabaab的所有短语、直接短语和句柄。
第 6 章自学内容第 6 章作业P100 6.8求下列句型的所有短语、简单(直接)短语和句柄。
编译原理笔记8 自上而下语法分析-带回溯的自顶向下分析技术
1.自上而下分析法的一般问题。
1)自上而下语法分析定义:从文法的开始符号开始,反复使用不同产生式进行推导以谋求与输入符号串相匹配。
注:此处的输入符号串是指词法分析结果的一串二元式。
2)一般方法:
a) 基本构成:设下推栈的初始状态包括两个符号:‘#S’,其中‘#’为栈
底,‘S’为文法开始符号。
整个分析过程在语法分析程序控制下进行。
在语法分析中用到的文法产生的表,称为语法表。
b) 算法
i. 若栈顶符号x是非终结符,查询语法表,找出一个以x为左部的产生
式,x出栈,并将其右部反续入栈,且输出带上记下产生式编号——
推导。
ii. 若栈顶符号x是终结符,且读头下的符号也是x,则x出栈,读头指向下一个符号——匹配。
iii. 若栈顶符号x是终结符,但读头下的符号不是x,则匹配失败。
这说明可能前面推导时选错了候选式,退回到上次推导现场(包括栈顶
符号、读头的指针和输出带上信息)——回溯。
iv. 回溯后选取另一候选式进行推导,若没有候选式可选,则进一步回溯。
若回溯到开始符号又已无候选式可选,则识别失败。
v. 若栈内仅剩下“#”,且读头也指向“#”,则识别成功。
c) 带回溯的自上而下分析法的缺陷
i. 如果文法存在左递归,语法分析会无限循环下去。
ii. 若产生式存在多个候选式,选择哪个进行推导完全是盲目的。
iii. 回溯会引起时间和空间的大量耗费。
iv. 如果被识别的语句是错的,算法无法指出错误的确切位置。
《编译原理》第4章自上而下语法分析
• 需要反复试探。
•问题1:回溯(P67)
x
S A y
• 例1:设有文法 (1) S xAy (2) A **|* 现有输入串:x*y 其分析过程如右:
•消除回溯
• 方法是:反复 “提取公共左因子”,使得文法 的每个非终结符号的各个候选式的首终结符集 两两不相交,来避免回溯。 设产生式为: A→δ α1|δ α2|…|δ αn
替换为:
Aδ A' A' α1|α2|…|αn
• 例3:有如下两个产生式:
<IF语句> if E then S1 else S2; <IF语句> if E then S1;
First(A1) = {a} First(A2) = {c} First(B1) = {b} First(B2) = {d}
• 在右边给定的文法中,A 的候选式有两个,其首终 结符集为: First(A1) = {*} First(A2) = {*} 相交,就会产生回溯
(1) S xAy
(2) A **|*
结论:能够从开始符号出发推导出给定的输入串,
因此,是句子。
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
自顶向下分析法: 从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子,从而建立语法树。
自底向上分析法: 从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号,从而建 立语法树。 具体分类:
编译原理分知识点习题自上而下语法分析
1.设有文法G[S]:S→ABA→bB|AaB→Sb|a试排除该文法的左递归。
解:此题考查排除左递归的方式。
应用排除文法左递归的算法对文法G[S]排除左递归的进程如下:(1)将非终结符排序为:U1=S,U2=A,U3=B(2)进入算法排序:i=1时,对文法无阻碍i=2,j=1时:A→Aa有直接左递归,消去该直接左递归,得A→bBA’A’→aA’|εi=3,j=1时:改写文法,有B→ABb|aj=2时:改写文法,有B→bBA’Bb|a无左递归。
(3)因此文法G[S]排除左递归后变成:G’[S]:S→ABA→bBA’A’→aA’|εB→bBA’Bb|a2.设有文法G[E]:E→Aa|BbA→cA|eBB→bd试依照递归子程序法为该文法构造语法分析程序。
解:此题考查递归子程序的构造方式。
第一判定文法是不是知足递归子程序法对文法的要求,然后再构造递归子程序。
因为:(1)该文法无左递归。
(2)文法的产生式E→Aa|Bb和A→cA|eB的右部有假设干选项,判定这两条产生式右部各候选式的终结首符号集合是不是两两互不相交。
对产生式E→Aa|Bb,有FIRST(Aa)∩FIRST(Bb)={c,e}∩{b}=ø对产生式A→cA|eB,有FIRST(cA)∩FIRST(eB)={c}∩{e}=ø文法中其他产生式都只有一个非空ε的右部。
综合(1)、(2),该文法能够采纳自上而下分析方式进行语法分析而可不能显现回朔和无穷循环。
下面为该文法的每一个非终结符号构造递归子程序。
假设用READAWORD代表读下一个单词。
用P(E)、P(A)、P(B)别离表示非终结符号E、A、B对应的子程序名。
约定输入符号串以“#”作为输入终止符。
P(E)的递归子程序为:PROCEDURE P(E);BEGINIF WORD IN FIRST(Aa)THENBEGINP(A);READAWORD;IF WORD=’a’THEN READAWORDELSE ERRORENDELSE IF WORD IN FIRST(Bb)THENBEGINP(B);READAWORD;IF WORD=’b’THEN READAWORDELSE ERRORENDELSE ERROREND;P(A)的递归子程序为:PROCEDURE P(A);BEGINIF WORDD=’c’THENBEGINREADAWORD;P(A)ENDELSE IF WORD=’e’THENBEGINREADWORD;P(B)ENDELSE ERROREND;P(B)的递归子程序为:PROCEDURE P(B);BEGINIF WORD=’b’THENBEGINREADAWORD;IF WORD=’d’THEN READAWORDELSE ERRORENDELSE ERROREND;主程序中的要紧内容为:READAWORD;P(E);IF WORD=”#”THEN WRITE(“RIGHT!”)ELSE WRITE(“ERROR!”)3.已知文法G[E]:G[E]:E→E+T|TT→T*F|FF→i|(E)请按递归子程序法为其构造语法分析程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.设有文法G[S]:S→ABA→bB|AaB→Sb|a试消除该文法的左递归。
解:本题考查消除左递归的方法。
应用消除文法左递归的算法对文法G[S]消除左递归的过程如下:(1)将非终结符排序为:U1=S,U2=A,U3=B(2)进入算法排序:i=1时,对文法无影响i=2,j=1时:A→Aa有直接左递归,消去该直接左递归,得A→bBA’A’→aA’|εi=3,j=1时:改写文法,有B→ABb|aj=2时:改写文法,有B→bBA’Bb|a无左递归。
(3)所以文法G[S]消除左递归后变为:G’[S]:S→ABA→bBA’A’→aA’|εB→bBA’Bb|a2.设有文法G[E]:E→Aa|BbA→cA|eBB→bd试按照递归子程序法为该文法构造语法分析程序。
解:本题考查递归子程序的构造方法。
首先判断文法是否满足递归子程序法对文法的要求,然后再构造递归子程序。
因为:(1)该文法无左递归。
(2)文法的产生式E→Aa|Bb和A→cA|eB的右部有若干选项,判断这两条产生式右部各候选式的终结首符号集合是否两两互不相交。
对产生式E→Aa|Bb,有FIRST(Aa)∩FIRST(Bb)={c,e}∩{b}=ø对产生式A→cA|eB,有FIRST(cA)∩FIRST(eB)={c}∩{e}=ø文法中其他产生式都只有一个非空ε的右部。
综合(1)、(2),该文法可以采用自上而下分析方法进行语法分析而不会出现回朔和无限循环。
下面为该文法的每一个非终结符号构造递归子程序。
假设用READAWORD代表读下一个单词。
用P(E)、P(A)、P(B)分别表示非终结符号E、A、B对应的子程序名。
约定输入符号串以“#”作为输入结束符。
P(E)的递归子程序为:PROCEDURE P(E);BEGINIF WORD IN FIRST(Aa)THENBEGINP(A);READAWORD;IF WORD=’a’THEN READAWORDELSE ERRORENDELSE IF WORD IN FIRST(Bb)THENBEGINP(B);READAWORD;IF WORD=’b’THEN READAWORDELSE ERRORENDELSE ERROREND;P(A)的递归子程序为:PROCEDURE P(A);BEGINIF WORDD=’c’THENBEGINREADAWORD;P(A)ENDELSE IF WORD=’e’THENBEGINREADWORD;P(B)ENDELSE ERROREND;P(B)的递归子程序为:PROCEDURE P(B);BEGINIF WORD=’b’THENBEGINREADAWORD;IF WORD=’d’THEN READAWORDELSE ERRORENDELSE ERROREND;主程序中的主要内容为:READAWORD;P(E);IF WORD=”#”THEN WRITE(“RIGHT!”)ELSE WRITE(“ERROR!”)3.已知文法G[E]:G[E]:E→E+T|TT→T*F|FF→i|(E)请按递归子程序法为其构造语法分析程序。
解:本题考查递归子程序的构造方法。
本题所给文法存在左递归,不满足递归子程序法对文法的要求,必须首先消除文法左递归,然后再构造分析程序。
因为文法只有左递归,采用扩充的BNF范式消除文法左递归得到:G[E]:E→T{+T}T→F{*F}F→i|(E)然后再应用书中介绍的方法即可求解。
假定用“ADV ANCE;”表示对读取下一个单词的过程的调用。
相应的递归子程序为:PROCEDURE P(E);BEGINP(T);WHILE SYM=’+’DOBEGINADV ANCE;P(T)ENDEND;PROCEDURE P(T);BEGINP(F);WHILE SYM=’*’DOBEGINADV ANCE;P(F)ENDEND;PROCEDURE P(F);BEGINIF SYM=’i’THEN ADV ANCEELSE IF SYM=’(’THENBEGINADV ANCE;P(E);IF SYM=’)’THEN ADV ANCEELSE ERRORENDELSE ERROREND;主程序中的主要内容为:ADV ANCE;P(E);IF WORD=”#”THEN WRITE(“RIGHT!”)ELSE WRITE(“ERROR!”)4.文法G[M]是否是LL(1)文法,说明理由。
G[M]:M→TBT→Ba|εB→Db|eT|εD→d|ε解:本题考查LL(1)方法对文法的要求,涉及到FIRST集、FOLLOW集的求法。
首先求出文法的每一个非终结符号的FIRST集、FOLLOW集:FIRST(D)=FIRST(d)∩FIRST(ε)={d, ε}FIRST(B)=FIRST(Db)∩FIRST(eT)∩FIRST(ε)=FIRST(db)∩FIRST(b)∩FIRST(eT)∩FIRST(ε)={d,b,e,ε}FIRST(T)=FIRST(Ba)∩FIRST(ε)={d,b,e,a,ε}FIRST(M)=FIRST(Tb)= {d,b,e,a,ε}FOLLOW(M)={#}FOLLOW(B)=FOLLOW(M)∪FIRST(a)\{ε}={a,#}FOLLOW(T)=FOLLOW(B)\{ε}∪FOLLOW(M) ∪FOLLOW(B)={d,b,e,#,a}FOLLOW(D)=FIRST(b)\{ε}={b}可以看出,对文法G[M]的产生式T→Ba|ε,有FIRST(Ba)∩FOLLOW(T)={d,b,e,a}∩{d,b,e,#,a}={d,b,e,a}≠ø仅此一条就会导致在自上而下的语法分析过程中出现回朔。
所以文法G[M]不是LL(1)文法。
5.构造一个LL(1)文法G,识别语言L:L={ω|ω为{0,1}上不包括两个相邻的1的非空串}并证明你的结论。
解:本题考查文法的构造方法以及LL(1)文法的要求。
首先构造出描述该语言的文法,然后证明该文法是LL(1)文法。
(1)根据题目要求——句子为不包括两个相邻的1的非空串,首先得到一个能够描述所有句子的文法G’[S]:S→0S|1A|0|1A→0S|0再根据LL(1)文法的要求,将文法改写为G[S]:S→0B|1CA→0BB→S|εC→A|ε(2)下面证明文法G[S]是LL(1)文法。
对产生式S→0B|1C,没有空产生式右部(ε),所以只要考查终结首符号集是否两两互不相交。
有FIRST(0B)∩FIRST(1C)={0}∩{1}=ø对产生式A→0B,只有唯一的不为空ε的右部,不用考查。
对产生式B→S|ε,因为有空产生式右部,所以要考查终结首符号集与后继终结符号集是否相交。
由于FIRST(S)={0,1} FIRST(ε)={ε}FOLLOW(B)= FOLLOW(S) ∪FOLLOW(A)= FOLLOW(S) ∪FOLLOW(C)=FOLLOW(S)={#}∪FOLLOW(B)={#}所以有FIRST(S)∩FIRST(ε)=ø和FIRST(B)∩FOLLOW(B)=ø对产生式C→A|ε,因为有空产生式右部,所以要考查终结首符号集与后继终结符号集是否相交。
由于FIRST(A)={0} FIRST(ε)={ε}FOLLOW(C) =FOLLOW(S) ={#}所以有FIRST(A)∩FIRST(ε)=ø和FIRST(C)∩FOLLOW(C)=ø综上所述,文法G[S]的每一条形如U→X1|X2|…|X n的产生式都满足FIRST(X i)∩FIRST(X j)=ø(i≠j)如果X j*ε时,还满足FIRST(X1)∩FOLLOW(U)=ø所以,文法G[S]是LL(1)文法。
6.有文法G[S]:S→aABbcd|εA→ASd|εB→SAh|eC|εC→Sf|Cg|εD→aBD|ε①求每一个非终结符号的FOLLOW集合。
②对每一个非终结符号的产生式选择,构造FIRST集合。
③该文法是LL(1)文法吗?解:本题考查LL(1)文法的要求,涉及文法符号串FIRST集,文法非终结符号的FOLLOW集的求法。
首先将文法压缩,得到S→aABbcd|εA→ASd|εB→SAh|eC|εC→Sf|Cg|ε①求每一个非终结符号的FOLLOW集合:∵S为开始符号,且有产生式A→ASd B→SAh C→Sf∴FOLLOW(S)={#}∪FIRST(d)∪FIRST(Ah)∪FIRST(f)={#,d,a,h,f}∵S→aABbcd A→ASd B→SAh∴FOLLOW(A)=FIRST(Bbcd)∪FIRST(Sd)∪FIRST(h)={b,a,d,h,e}∵S→aABbcd∴FOLLOW(B)=FIRST(bcd)={b}∵B→eC C→Cg∴FOLLOW(C)=FOLLOW(B)∪FIRST(g)={b,g}②对每一个非终结符号的产生式右部选项,构造FIRST集合对S:FIRST(aABbcd)={a} FIRST(ε)={ε}对A:FIRST(ASd)={a,d} FIRST(ε)={ε}对B:FIRST(SAh)={a,d,h} FIRST(eC)={e}FIRST(ε)={ε}对C:FIRST(Sf)={a,f} FIRST(Cg)={a,f,g}FIRST(ε)={ε}③由于存在产生式C→Sf|Cg|εFIRST(Sf)∩FIRST(Cg)={a,f}∩{a,f,g}≠ø所以该文法不是LL(1)文法。
7.已知文法G[A]:A→aAa|ε(1)该文法是LL(1)文法吗?为什么?(2)若采用LL(1)方法进行语法分析,如何得到该文法的LL(1)分析表?(3)若输入符号串“aaaa”,请给出语法分析过程。
(4)请给出该文法的递归下降分析子程序。
解:(1)因为产生式A→aAa|ε有空产生式右部,而FOLLOW(A)={#}∪FIRST(a)={a,#}造成FIRST(A)∩FOLLOW(A)={a,ε}∩{a,#}≠ø所以该文法不是LL(1)文法。
(2)若采用LL(1)方法进行语法分析,必须修改该文法。
因该文法产生偶数(可以为0)个a,所以得到文法G’[A]:A→aaA|ε此时对产生式A→aaA|ε,有FOLLOW(A)={#}∪FOLLOW(A)={#},因而FIRST(A)∩FOLLOW(A)={a,ε}∩{#}= ø所以文法G’[A]是LL(1)文法,按LL(1)分析表构造算法构造该文法的LL(1)分析表如表5.1所示。
(3)若采用LL(1)方法进行语法分析,对符号串“aaaa”的分析过程如表5.2所示(4)构造文法G’[A]的递归子程序如下(假定用“ADV ANCE;”表示对读取下一个单词的过程的调用):PROCEDURE P(A);BEGINIF WOR D=’a’THEN BEGIN ADV ANCE;IF WORD=’a’THEN BEGIN READAWORD;P(A);ENDELSE ERRORENDELSE IF NOT(WORD IN FOLLOW(A))THEN ERROREND;主程序中的主要内容为:ADV ANCE;P(A);IF WORD=”#”THEN WRITE(“RIGHT!”)ELSE WRITE(“ERROR!”)8.设文法G[S]:S→SbA|aAB→SbA→Bc①将该文法改写成LL(1)文法。