8.第四章自顶向下的语法分析(1)

合集下载

编译原理-四章自顶向下语法分析法

编译原理-四章自顶向下语法分析法

第四章自顶向下语法分析方法语法分析是编译过程的核心部分。

语法分析的任务是:按照文法,从源程序符号串中识别出各类语法成份,同时进行语法检查,为语义分析和代码生成作准备。

执行语法分析任务的程序称为分析程序。

也称为语法分析器,它是编译程序的主要子程序之一。

在第二章中我们已经介绍过。

通过语法分析可建立起相应的语法树。

按语法树的建立方法,我们将语法分析方法分成两大类,即自顶向下分析和自底向上分析。

下面,我们先介绍自顶向下分析。

本章重点:自顶向下分析、LL(1)分析第一节自顶向下分析方法一、带回溯的自顶向下分析算法这是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的方法,从识别符号出发,根据文法自上而下地为输入串建立一棵语法树。

下面用一个简单例子来说明这种过程:假定有文法G[S]:S→cAdA→ab|a 以及输入串w=cad为了自上而下地构造w的语法树,我们首先按文法的识别符号产生根结点S,并让指示器IP指c的规则(此处左部为S的规则仅有一条)( a)(b)(c)图3-1-1图3-1-1a。

我们希望用S的子结从左至右匹配整个输入串w。

首先,此树的最左子结是终结符c为标志的子结,它和输入串的第一个符号相匹配。

于是,我们就把IP调整为指向下一输入符号a,并让第二个子结A去进行匹配,非终结符A有二个选择,我们试着用它的第一个选择去匹配输入串,于是把语法树发展为图3-1-1b。

子树A的最左子结和IP所指的符号相符,然后我们再把IP调为指向下一符号d并让A的第二个子结进入工作。

但A 的第二个子结为终结符号b,与IP当前指的符号d不一致。

因此,A宣告失败。

这意味着A的第一个选择此刻不适用于构造w的语法树。

这时,我们应该回头(回溯)看A是否还有别的选择。

为了实现回溯,我们一方面应把A的第一个选择所生长的子树注销掉;另一方面,应把IP恢复为进入A时的原值,也就是让它重新指向第二输入符号a。

现在我们试探用A的第二个选择,即考虑生成图3-1-1c的语法树。

第4章 自顶向下语法分析方法PPT课件

第4章 自顶向下语法分析方法PPT课件
A' → β1|β2|…|βn
例4.7 文法G2[A]: A→ad A→Bc B→aA B→bB
1.化为: 2.化为: 3.化为:
A→ad A→a(d|Ac) A→aA'
A→aAc A→bBc A→bBc
A→bBc B→aA
A'→d
B→aA B→bB
A'→Ac例4.8
第1个“L”指的是由左向右地处理输入。 第2个“L”指的是它为输入串描绘出一个最左推导。 括号中的数字1意味着它只需向右看1个符号便可决
定如何推导即选择哪个产生式(规则)进行推导。
4.2 LL(1)文法的判别
求出能推出ε的非终结符 计算FIRST集 计算FOLLOW集 计算SELECT集 判别是否是LL(1)文法
Y到1F..YIRi-S1 T*(X))中,则;把特F别IR是S,T若(Y所j)有中的的F所IR有S非T(Y元j ,素都加
j=1,2,…,K)均含有,则把加到FRIST(X)中.
用关系图法求文法符号的FIRST集(自学)
3.计算FOLLOW集
根据定义计算 1.对于文法的开始符号S,置#于FOLLOW(S) 中; 2.若A→αBβ是一个产生式,则把 FIRST(β)-{}加至FOLLOW(B)中; 3.若A→αB是一个产生式,或A→αBβ是一个产
第一次扫描
是是

第二次扫描 是

2.计算FIRST集
根据定义计算 1.若XV,则FIRST(X)={X} 2.若XVN,且有产生式Xa…, a∈ V,则 a∈FIRST(X);若X也是一条产生式,则 ∈FIRST(X). 3.若XY…是一个产生式且YVN,则把FIRST(Y) 中的所有非元素都加到FIRST(X)中;若X Y1Y2…YK 是一个产生式,Y1,Y2,…,Yi-1都是非终结 符,而且对于任何j,1≤j ≤i-1,FIRST(Yj)都含有(即

第四章 自顶向下的语法分析-LL(1)

第四章 自顶向下的语法分析-LL(1)
编译程序原理与实现
张晶
2011.3
第四章 自顶向下的语法分析
• 4.1 自顶向下语法分析概述 • 4.2 三个重要的集合 • 4.3 递归下降语法分析方法 • 4.4 LL(1)语法分析方法
4.4 LL(1)语法分析方法

LL(1)语法分析方法的主要思想 LL(1)文法 LL(1)分析表 LL(1)分析驱动程序 LL(1)分析程序的自动生成器
(5) T’ * F T’
(6) T’ (7) F (E) (8) F i
{*}
{),+, # } {(} {i}
T’ (6) (5)
F
(9) F n
{n}
4.4 LL(1)语法分析方法
LL(1)语法分析方法的主要思想 LL(1)文法 LL(1)分析表 LL(1)分析驱动程序
如何建立LL(1)分析表?
对于任意的一个LL(1)文法G = (VN, VT, S, P)
VT = {a1, …, an}
VN = {A1, …, Am} LL(Ai, aj) = Ai , 如果ajpredict(Ai ) LL(Ai, aj) = error(), 如果aj 不属于Ai的任何一条产生式 的预测符集
*fmq 开关说明
*define 常数定义部分 *terminals 终极符定义部分 *productions 由空格隔开的若干 (可以是零个)选 择开关
first打印FIRST集合 follow打印FOLLOW集合 parstable打印分析动作表 vocab打印文法符号
text/binary输出表以文本/ <常数名> <无符号整数> 二进制形式表示
LL(1)方法的主要思想

第4章 自顶向下的语法分析

第4章 自顶向下的语法分析

6
分析中出现的问题2:回溯问题
从各种可能的选择中随机挑选一种, 并希望它是正确的。 如果以后发现它是错误的,必须退 回去,再试另外的选择这种方式称为回 溯。 回溯代价极高,效率很低。
7
在自上而下的分析方法中如何选择使 用哪个产生式进行推导? 假定要被替换的最左非终结符号是B, 且有n条规则:B→A1|A2|…|An,那么如何 确定用哪个右部去替代B? 从文法的开始符号出发,如何根据当前 的输入符号(单词符号)唯一地确定选用哪 个产生式替换相应非终结符往下推导,或构 造一棵相应的语法树。
8
§4.2 FIRST和FOLLOW集合的构造
9
例1:输入串w=pccadd是否是合法的句子?
G:S→pA|qB A→cAd|a B→dB|b
S=>pA=>pcAd=>pccAdd=>pccadd 总结:本题中对于一个非终结符,存在若干 个候选式,即产生式形如:P→α1|α2|……|αn 每个候选式的第一个字符都是终结符, 且都不相同。这时可直接选用与当前输入符 号相同的那个候选式来替换P。
42
3. 若X为一非终结符,则查分析表M。 若M[X,a]中为A—产生式,将A自栈 顶弹出,将产生式右部符号串按逆序逐 一推入栈中;当产生式为A时,则只将 A→ε弹出即可。若M[X,a]中为空,则调 用出错处理程序。
43
算法实现
当前字符匹 配成功。 要对栈顶的 非终结符进 行替换。
44
初始化
注意一 定要逆 序入栈。
48
49
通过表4-9可以看到,每个非终结符对应 产生式的各个候选式的交集如下:
可以验证,此文法是LL(1)文法。
50
递归下降语法分析程序如下:

第四章 自顶向下的分析

第四章 自顶向下的分析
If X1…Xn 都是可空的(全可推出ε ), 则 SectionFirst(X1…Xn) = (First(X1) -{ε}) (First(X2)-{ε})… (First(Xn) -{ε}) ∪{ε}
G[S]:
S→AB|bC 已求出能推出ε的非终结符集为 {A,B,S} A→b|ε B→aD|ε C→AD|b D→aS|c
– ε可能是First 集合的元素,但绝不会出现在 Follow 集合中 – 非终结符、终结符的符号串、非终结符的符 号串都存在First集合, 而Follow 集合仅为非 终结符而定义 – Follow集合的定义运算在产生式的 “右边”, 而 First集合的定义运算在产生式的“左边”
4 按照LL(1)文法的定义判别


3 LL(1) 文法的定义

LL(1) 文法
一个文法是 LL(1) 文法,则需要满足下面 的条件: 每一个产生式 A->α1|α2|…|αn 对于所有 i 和 j,1≤i,j ≤ n,i≠j, First(αi) ∩First(αj) = Φ 对于每一个非终结符 A ,如果 First(A) 中包含ε, 则First(A) ∩Follow(A) = Φ
4.2 LL(1) 文法的判别
LL(1) 文法的判别分为四步: 计算能推出ε的非终结符集 计算每一个产生式的右边串α的 FIRST(α) 集合 计算每个非终结符A的FOLLOW(A) 集合 按照LL(1)文法的定义识别
1. 2. 3.
4.
1计算能推出ε的非终结符集
可空的 当存在一个推导A=>*ε 时,非终结符 A 称作 是可空的。 算法
初值 第一次 第二次
非终结符集 S {A,B} {A,B,S} {A,B,S}

第4章 自顶向下语法分析方法

第4章 自顶向下语法分析方法

结论
• 不一定每个文法的左公共因子都能在有限 的步骤内替换成无左公共因子的文法。 • 一个文法提取了左公共因子后,只解决了 相同左部产生式右部的FIRST集不相交问 题,当改写后的文法不含空产生式,且无 左递归时,则改写后的文法是LL(1)文法, 否则还需用LL(1)文法的判别方式进行判断 才能确定是否为LL(1)文法。
2.化为: S→aS(d|c) S→bc A→aS A→b
3.化为: S→aSA' S→bc A'→d A'→c A→aS A→b
结果中A是不可达到的符号。
• 例:文法G4[S] 为: S→Ap|Bq A→aAp|d B→aBq|e
1.化为: S→aApp|aBqq|dq|eq A→aAp|d B→aBq|e
调用返回
• 定义:一个上下文无关文法是LL(1)文法的 充要条件是: 对每个非终结符A的两个不同产生式A→α 和A→β,满足 SELECT(A→α)∩SELECT(A→β)=Φ * 其中α,β不同时能 ε
LL(1)文法的含义:
• 第一个L表示:自顶向下分析是从左向右扫 描输入串。 • 第二个L表示:分析过程中将用最左推导。 • 1表示:只需向右看一个符号便可决定如何 推导(即选择哪个产生式进行推导)。 • 类似也可以有LL(K)文法:需向前查看K个 符号才可确定选用哪个产生式。
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
FIRST(S)=(FIRST(A)-{ε})∪FIRST(B){ε})∪{ε}∪{b}={a,b,ε}
FIRST(A)={b, ε} FIRST(B)={a, ε} FIRST(C)={a,b,c} FIRST(D)={a,c}

4第四章 自顶向下语法分析法1

4第四章 自顶向下语法分析法1
回溯分析程序的特点:功能强大,但非常慢,一般都在指 数的数量级,所以对于实际的编译器并不合适。
两类预测分析算法: (1)递归下降分析(recursive-descent parsing)很常 用,且最适合于手写的分析程序最为适合。 (2)LL(1)分析( LL(1) parsing)中第1个“L”指由左向 右地处理输入;第2个“L”指利用最左推导进行分析;括 号中的数字1仅向前查看一个符号进行预测分析。LL(k)分 析利用向前查看k个符号进行预测分析。
+
/\
+5
/\
34 构造过程: (1)对每个运算都实施语法树的生成 (2)对每个递归函数加上当前语法树树根的返回
syntaxTree exp ( )
{
syntaxTree temp, newtemp;
temp = term ( ) ;
while (token == ‘+’ || token = ‘-’){
• 请编写以下表达式文法的递归下降分析程序。
exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → ( exp ) | number
识别factor → ( exp ) | number的递归下降子程序如下: void factor( ) {
G[E]={E→E+T|T, T→T*F|F, F→(E)|i },
符号串i+i*i自顶向下的分析过程:
• 自顶向下的分析程序有两类: (1)预测分析程序(predictive parser)试图利用超前 查看一个或多个记号来预测出该选择哪条规则。 (2)回溯分析程序(backtracking parser)则试着分析 所有的可能输入,当一种可能失败时就要求输入中备份任 意数量的字符。

编译技术-第4章-语法分析(一)

编译技术-第4章-语法分析(一)
基本任务:识别符号串S是否为某语法成分。 两大类分析方法:
自顶向下分析 自底向上分析
自顶向下分析算法的基本思想为:
若Z + S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
主要问题: ➢ 左递归问题 ➢ 回溯问题
▪ 主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为:
第四章 语法分析
• 语法分析的功能、基本任务 • 自顶向下分析法> • 自底向上分析法>
复习:第一章 概述
编译过程是指将高级语言程序翻译为等价的目标程 序的过程。 习惯上是将编译过程划分为5个基本阶段:
词法分析 语法分析 语义分析、生成中间代码 代码优化 生成目标程序
4.1 语法分析概述
功能:根据文法规则,从源程序单词符号串中识别出语法 成分,并进行语法检查。
若有规则:U∷=x|xy 则可以改写为:U∷=x(y|ε) 注意:不应写成U∷=x(ε|y)
使用提因子法,不仅有助于消除直接左递归,而且有 助于压缩文件的长度,使我们能更有效地分析句子。
规则二
若有文法规则:U∷=x|y|……|z|Uv
其特点是:具有一个直接左递归的右部并位于最后, 这表明该语法类U是由x或y……或z其后随有零个 或多个v组成。
若Z + S
G[Z]
则 S L(G[Z]) 否则 S L(G[Z])
主要问题: ➢ 句柄的识别问题
▪ 主要方法: • 算符优先分析法 • LR分析法
4.2 自顶向下分析
4.2.1 自顶向下分析的一般过程
给定符号串S,若预测是某一语法成分,则可根据该 语法成分的文法,设法为S构造一棵语法树, 若成功,则S最终被识别为某一语法成分,即

自顶向下的语法分析

自顶向下的语法分析

自顶向下的语法分析语法分析是语言学中一个重要的领域,它主要研究语言的结构,特别是句子的结构和语义。

自顶向下的语法分析是一种常用的语法分析方法,也称为“顶向句法”或“句法下行”。

它被定义为根据语言的上层构造来推断下层构造的一种策略。

自顶向下的语法分析的基本思想是,从一个句子的最顶层(或最外层)开始,从上而下逐层分解它,直至分解出个别单词或元素为止。

它通常利用语言语法的上下文无关性原则。

它允许类似于模糊推理,从而可以利用语言树结构来推测表达的额外信息和更深层次的意思。

自顶向下的语法分析的过程通常如下:首先,通过自动识别技术,识别语料中句子的成分,这是一个可以自动完成的过程;其次,从句子的最顶层,开始依次断出句子结构的层次,这是一个人工完成的过程;最后,根据推测出的层次,分析句子语义,并做出相应的判断。

自顶向下的语法分析也可用来处理句子中的歧义。

它也可用于处理复杂句子,比如复合句、从句等。

除此之外,它还可以处理冗余句,比如重复、拖尾等,从而进一步分解语句。

自顶向下的语法分析是一种非常有效的方法,也是计算机语言处理的基础。

近年来,随着计算机的发展,自顶向下的语法分析技术得到了进一步的改进和发展,应用于更多的领域,如自然语言处理、机器翻译、人机对话、智能搜索、智能问答等。

自顶向下的语法分析不仅可以用于机器理解,而且还可以用于人类理解。

它可以帮助人们更快、更全面地理解句子的结构,也可以加深人们对语言抽象类概念的理解。

此外,它还可以帮助学生和教师更有效地学习和教学,更好地掌握文法的规则,更好地掌握语言的抽象概念,并培养学生的语言素养。

自顶向下的语法分析方法确实具有重要的理论和实用价值,但它也存在一些缺点。

不同语言有不同的语法规则,而自顶向下的语法分析方法假定语言具有一些共同的规则,而这种规则可能不一定适用于所有语言。

此外,自顶向下的语法分析也不太灵活,往往不能很好地处理复杂的语句,也容易受到歧义的影响。

总的来说,自顶向下的语法分析是一种有效的语法分析方法,它不仅可以用于计算机语言处理,而且可以用于人类理解,帮助人们更好地理解语言结构,也可以加强人们对语言抽象概念的理解,有利于学习和教学。

自上而下语法分析方法-第四章(1)

自上而下语法分析方法-第四章(1)
AcA AaA
练习:求给定文法的每个候选式的First

SAp SBq Aa AcA Bb BdB
解:
First(S1) = First(Ap) ={ a,c } First(S2) = First(Bq)={b,d } First(A1) = {a} First(A2) = {c} First(B1) = {b} First(B2) = {d}
• 语法分析器的输出
– 分析树:表示方法? 见教材 P89 – 错误处理信息:定位、继续编译
• 语法分析器的功能
– 按照语言的语法构成规则, 识别输入的符号 串能否构成一个句子。这些规则是用文法的 产生式来定义的。
• 问题
– 对给定的一个输入串,如何判定它是不是一 个句子?
• 方法
– 根据文法的产生式规则,从开始符号出发, 看能否推导出与这个输入串匹配的句子。这 就需要建立与输入串匹配的语法分析树。
求某一非终结符A的首终结符集First(A)的算法为:
• 1.若有产生式Aaα,a∈VT,把a加到First(A)中; • 2.若有产生式Aε, 把ε加到First(A)中;
• 3.若有产生式AXα,X∈VN,把First(X)中非ε元素 加到First(A)中;
• 4.若有产生式AX*1X2X3...Xkα,其中X1X2...Xk∈VN。则 –当X1X2X3...Xi =>ε(1≤i≤k)时,把 First(Xi+1...Xkα)的非ε元素加到 First(A)中; –当X1X2X3...Xk=*>ε时,把First(α)加入First(A)中
• 在右边给定的文法中,A 的候选式有两个,其首终 结符集为:
First(A1) = {*} First(A2) = {*}

第四章自顶向下的语法分析

第四章自顶向下的语法分析
School of Computer Science & Technology Harbin Institute of Technology
第四章 自顶向下的 语法分析
重点:自顶向下分析的基本思想,预测分析器总体结构,预测分 析表的构造,递归下降分析法基本思想,简单算术表达式的递归 下降分析器。 难点:FIRST 和 FOLLOW 集的求法,对它们的理解以及在构造 LL(1)分析表时的使用。递归子程序法中如何体现分析的结果。
2020/6/3
16
4.2.3 LL(1)文法
如果存在A→ε这样的产生式,则需定义FOLLOW(A)
A∈V定义A的后续符号集为:
1. FOLLOW(A)={a|S * αAaβ, aT, α,β(V∪T)*} 2. 如果A是某个句型的最右符号,则将结束符# 添加到FOLLOW(A)中 3. 如果αj ε* ,则如果对i(1im;i≠j),
begin 4.if (X→εP) then FIRST(X):= FIRST(X)∪{a|X→a…∈P}; 5.if (X→ε∈P) then FIRST(X):= FIRST(X)∪{a|X→a…∈P}∪{ε}
end
6.对X∈V,重复如下的过程7-10,直到所有FIRST集不变为止。
7.if (X→Y…∈P and Y∈V) then FIRST(X):= FIRST(X)∪(FIRST(Y)-{ε});
+
αAβ至少需要两步推导,则称文法G是间接递归的,当 α=ε时称之为间接左递归;如果文法G中存在形如 AαAβ的产生式,则称文法G是直接递归的,当α=ε 时称之为直接左递归。
Ger:ET EE+T EE-T TF TT*F TT/F F(E) Fid

04 语法分析(1) _ 概述(含 消除左递归)

04  语法分析(1) _ 概述(含 消除左递归)

消除间接左递归的方法:
(1) 把间接左递归文法改写为直接左递归文法;
(2) 用消除直接左递归的方法改写文法。
下面给出一个消除文法所有左递归性的算法,该算
法对文法的要求是:文法不含回路(形如PP的
推导),且不含以ε为右部的产生式。
通用算法
• 阅读 P84 算法4.1
①把G的非终结符按任意顺序排列,如A1,…,An ②for(i=1;i<=n;i++)
0 1
q0
1
q1

q2
【定义】一个下推自动机可定义为一个7元组:
PDA M=(Q, , , q0, Z0, F, )
其中: ① Q是有限状态集; ② 是输入符号集; ③ 是栈符号集; ④ q0Q,称为起始状态; ⑤ Z0,称为栈起始符; ⑥ FQ,称为接受状态集; ⑦ 是转移函数,定义域为Q×({ε})×,且表示由 “当前状态qi、输入符号a和栈顶符号x决定PDA的转 移动作”。值域为Q×*,指明下推自动机的动作结 果包括“状态转移和栈操作”。
例4.6
设有文法G: I→I0 | Ia | Ib | a | b
对左递归文法G改写后的文法G'为 I → aI' | bI' I ' → 0I' | aI' | bI' |ε
习题 4.8
将下面的左递归文法G(S)改为非左递归的。
S → SaP|Sf |P P → QbP|Q Q → cSd|e 【解】 S → PS’ S’→ aPS’| f S’|ε P → QbP|Q Q → cSd|e
第4章 语法分析
—— 自顶向下分析法
思考题
上次课所留问题:
设计例3-3的词法分析程序。

自顶向下的语法分析

自顶向下的语法分析

自顶向下的语法分析自顶向下的语法分析是计算机科学中一种重要的自然语言处理技术,其目的是将一句复杂的句子分解成若干基本的句子结构,以便更容易地理解和处理它们。

因此,自顶向下的语法分析可以被看作是一种从句子结构上解析句子的方法。

本文将通过介绍自顶向下语法分析的基本原理和其在实际应用中取得的成果,来阐述自顶向下语法分析的重要性以及如何实施它。

首先,本文将介绍自顶向下语法分析的原理和算法,以及它的关键概念;其次,讨论自顶向下语法分析的优点和缺点;最后,讨论自顶向下语法分析在当前的语言处理中的应用。

自顶向下语法分析的基本原理是将复杂的句子逐层分解成更简单的句子,从而最终获得需要的句子结构。

与此相反,从底向上的语法分析是从一句话的最末尾开始读取,分析和匹配,以识别句子的结构。

自顶向下语法分析的关键概念是语法规则(grammar rules)和终结符(terminal symbols)。

语法规则的作用是用于描述文法结构的规则,它们用来消除文法中间出现的歧义。

终结符是某个文法对象,用来在句子中表示特定的词语或概念,它们可以是动词、名词、形容词等。

自顶向下语法分析的优点在于能够快速将一句复杂的句子分解成若干基本的句子结构,减少时间和空间开销。

然而,它也存在一些缺点:首先,它不容易处理不确定性,而且它也不能处理多义性的句子;其次,它也不能处理拼写和语法错误的句子;最后,它的算法也不容易实现。

自顶向下语法分析在当代语言处理中发挥着重要的作用。

如今,自然语言处理已经广泛应用于搜索引擎,机器翻译,语音识别等多领域中,而自顶向下语法分析正是这些应用中最关键的技术之一。

综上所述,自顶向下语法分析是一种有效的解析句子的方法,它可以帮助我们在计算机科学中有效地处理句子,在多个领域中发挥着重要的作用。

未来,人工智能和语言处理的发展将会给自顶向下语法分析带来更大的发展前景,以期能更好地处理和理解自然语言。

第4章自顶向下的句法分析

第4章自顶向下的句法分析

(2) 无回溯,对文法的任一非终结符号,当其产生 式右部有多个候选式可供选择时,各候选式所推 导出的终结符号串的首字符集合要两两不相交。 例如,如果有文法G[S]: S xAy A ab∣a 输入串xay的分析就需要回溯。 带回溯的自顶向下分析方法实际上是一种穷举的 试探方法,其分析效率极低。
第4章 自顶向下的句法分析
输入串: a1 a2
… ai
… an #
栈顶
xj

x1 # 分析栈
控制程序 分析表M
LL(1)分析器
输出
第4章 自顶向下的句法分析
(1) 输入串是待分析的符号串,它以界符“#” 作为结束标志。(注:#VT但不是文法符 号,是由分析程序自动添加的。)
(2) 分析栈中存放分析过程中的文法符号。 分析开始时栈底先放入一个“#”,然后再压 入文法的开始符号;当分析栈中仅剩“#”, 输入串指针也指向串尾的“#”时,分析成功。
5)提取公共左因子 倘若产生式的候选式不含公共左因子,则
推导出的首字符能与输入符号匹配的那个候选 式便是唯一的匹配。
在文法G[S]中的每个非终结符相应的产生 式右部均不含公共左因子的情况下,语法分析 的匹配过程都是唯一匹配,无需试探;这时若 匹配失败,则意味着输入串不是句子。
第4章 自顶向下的句法分析
第4章 自顶向下的句法分析
消除回溯的方法 预测与提左因子
预测 根据超前读入符号选择候选式,使其第一个符号 与超前读入符号相同,或该候选式可推导出的第 一个符号与超前读入符号相同。这相当于向前看 了一个符号,所以称为预测。
注:使用了预测之后,选择候选式不再是盲目的 了,所以也就无需回溯。
第4章 自顶向下的句法分析
}
第4章 自顶向下的句法分析

第四章+自顶向下的语法分析

第四章+自顶向下的语法分析

E id
+ E id
*
18
三、重要问题——二义性及其消除
二义性文法 E→E+E|E-E|E*E|E/E|(E)|id 非二义性文法 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id 改造方法:引入语法变量,使文法含有更多的信息
19
三、重要问题——二义性及其消除
再例:If语句 S→if E then S S→if E then S else S S→other 设执行下列语句前b=0, 理解1:if a≠0 then if a>0 then b=1 else b=-1 当a=1时,执行后b=1;当a=-1时,执行后b=-1 理解1: if a≠0 then if a>0 then b=1 else b=-1 当a=1时,执行后b=1;当a=-1时,执行后b=0
中间代码
代码优化器
中间代码
目标代码生成器
目标代码
7

语法分析:推导、规约 推导中遇到的问题:

回溯 死循环 二义文法 LL文法


选择确定的候选式进行推导

引入First集和Follow集 思考什么样的文法叫LL文法 预测分析表 控制程序 数据结构

预测分析器(预测分析法)

第4章 自顶向下的语法分析
语法分析(Syntax Analysis) 文法的改造问题 自顶向下(Top Down)的分析 推导(Derivation)
2011-12-25 9
4.1 语法分析的任务

语法分析(Syntax Analysis)

检查扫描器输出的单词序列是否符合该语 言的文法——组成句子,并分析组成此句 子的语法成分 Parser Syntax Analyzer

编译原理之自顶向下语法分析方法(25页)

编译原理之自顶向下语法分析方法(25页)
*
间接左递归 若 PP α S→Aa A→Sb A→b
2021/8/25
5
消除左递归
消除直接左递归 形如:P → P α| β α非, β不以P打头
改写为:P → βP’ P’ → αP’|
2021/8/25
6
消除左递归
例:E → E+T|T T →T*F|F F →(E)| i
G[ E]: (1) E → TE’ (2) E’ → +TE’| (3) T → FT’ (4) T’ → *FT’ | (5) F → (E)|i
A →Bb|b
2021/8/25
10
回溯问题
例:S →iEtS|iEtSeS|a
E→b
判断句子ibtaea
提取左公因子:A →αβ1|αβ2
变为:
A →αA’
A’ →β1 |β2
若A →αβ1|αβ2 |…|αβn|r
变为:
A →αA’|r
A’ →β1 |β2|…|βn
2021/8/25
11
例:S →iEtS|iEtSeS|a
2021/8/25
Procedure E’; IF sym=‘+’ then Begin advance; T;E’ End;
Procedure T’; IF sym=‘*’ then Begin advance; F;T’ End;
14
3非递归的预测分析方法(LL(1))
一、总控程序 Input
24
非LL(1)文法的改造
消除左递归 提左公因子
2021/8/25
25
22
三、LL(1)文法:
一个文法G,若它的分析表M不含多重定义入 口,则称为LL(1)文法。

第章语法分析——自顶

第章语法分析——自顶

4.2.1 FIRST集合定义及构造方法
对 于 文 法 G 的 任 一 符 号 串 α=X1X2…Xn 可 按 下 列 步 骤 构 造 其 FIRST(α)集合: 1)置FIRST(α)=φ 2)将FIRST(X1)中的一切非ε符号加进FIRST(α); 3) 若 ε∈FIRST(X1) , 将 FIRST(X2) 中 的 一 切 非 ε 符 号 加 进 FIRST(α) ; 若 ε∈FIRST(X1) 和 FIRST(X2) , 将 FIRST(X3) 中 的一切非ε符号加进FIRST(α);余类推。 4) 若 对 于 一 切 1≤i≤n , ε∈FIRST(Xi) , 则 将 ε 符 号 加 进 FIRST(α)。
U
INPUTSYM =‘b’ Y
N 语法错误: 输入串少‘b’
出口
图4.1(a) 非终结符号Z的分析程序
4.3.1 递归下降分析的基本方法
U::=dZ|e
过程U
INPUTSYM =‘d’ N Y
INPUTSYM=下一个符号
Z
INPUTSYM =‘e’ Y
N PUTSYM=下一个符号
={+,),#} FOLLOW(F)= FIRST(T’) ∪ FOLLOW(T) ∪ FOLLOW(T’)
= {+,*,) ,# } FOLLOW(T’)= FOLLOW(T)= { + , ) , # }
4.3 递归下降分析
4.3.1 递归下降分析的基本方法
递归下降分析的概念极为简单,其方法是将文法中的每一个非终结符U的文 法规则看作是识别U的一个过程定义,为每个非终结符号构造一个子程序, 以完成该非终结符号所对应的语法成分的分析和识别任务。如果U的文法规 则的右部只有一个侯选式,则按从左向右的顺序依次构造规则U的识别过程 代码。如果有终结符号,判断能否与输入的符号相等,如果相等,表示识别 成功,读入指针指向下一个输入符号;如果不等,则意味着输入串此时有语 法错误。如果是非终结符号,则简单调用这个非终结符号的子程序,由这个 子程序完成该非终结符号所对应的语法成分的分析和识别任务。当一条规则 右部有多个侯选式时,则根据每个侯选式的第一个符号确定该侯选式分支。 只有被调用的分析和识别某语法成分的子程序匹配输入串成功,且正确返回 时,该语法成分才算真正获得识别。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S S d c b A a d
A→ab|a
?句子cad是该文法定义语言的句子
当需要用A派生 时,无法根据输 入符号a唯一的 确定A的候选式
34
c a
A
2015-3-29
候选式的确定与回溯(Backtracking)

给定文法S→cABd A→ab|ε
S S c A B d ε
B→a
?句子cad是该文法定义语言的句子
C
E If a≠0 then if S
T S(非最长) C
E a>0 then S b=1 S else b=-1
三、重要问题——二义性及其消除
S→TS|CS C→if E then T →CS else
S
S
S T (最长) T (最长) C C S
C
C
if E then if E then S else if E then S else if E then S
发现不匹配,需 要回退(回溯)
S x A y
S xAy
x**y
匹配成功
2015-3-29
S
x A y
7
三、重要问题——回溯
x * * y
xAy x*y
发现不匹配,需要回退
S
S x A y
x * * y
S
xAy x**y
匹配成功
S
x A y
2015-3-29
8
三、重要问题——二义性及其消除
E → E + T| T T → T * F|F F → ( E )|id E→ T E’
E ’→ + T E ’| ε
T→ F T’ T’→* F T’|ε F→ ( E )|id
2015-3-29
21
例: 间接左递归的消除
S→Ac|c
A→Bb|b B→Sa|a 将B的定义代入A产生式得:A→Sab|ab|b 将A的定义代入S产生式得: S→Sabc|abc|bc|c 消除直接左递归: S→abcS’|bcS’|cS’ S’→abcS’|ε 删除“多余的”产生式:A→Sab|ab|b和 B→Sa|a 结果: S→abcS’|bcS’|cS’ 2015-3-29 S’→abcS’|ε

E→E+E|E-E|E*E|E/E|(E)|id 对 同 一 句 子存 在两棵语法分析树,哪个是对的?
E E
E
id
Байду номын сангаас
+ E
id
E
* E id
E E
id + E
*
E
id
2015-3-29
id
9
三、重要问题——二义性及其消除
二义性文法 E→E+E|E-E|E*E|E/E|(E)|id 非二义性文法 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id 改造方法:引入语法变量,使文法含有更多的信息
当需要用A派生 时,因为A→ε 使得无法根据输 入符号a唯一的 确定A的候选式
35
c A B d a
2015-3-29
b
a
E→E+T|E-T|T|-E T→T*F|T/F|F F→F↑P|P P→(E)|id|const|FUN(L) FUN→ abs | sin | cos | ln | log | exp | sqrt L→E|E,L

VN={E,T,F,P,FUN,L} VT={id,const,+,-,*,/,(,), \,, abs,sin,cos,log,ln,exp,sqrt} S= E 2015-3-29 19
EE+E a1+E a1+E*E a1+a2*E a1+a2*a3

EE+E E+E*E E+E*a3 二义性(先天二义性语言、二义性文法) E+a2*a3 a1+a2*a3
2015-3-29 6
三、重要问题——虚假匹配
S xAy
输入串x**y
S→xAy A→**|* x*y
E
a>0 then
M
b=1 else
M
b=-1
按照“改造2”构造的语法树
S→TS|CS C→if E then T →CS else
C S
S T(最长)
C
E
If a≠0 then
E
if a>0 then
S
b=1
S
else b=-1
按照“改造2”构造的语法树
S→TS|CS C→if E then T →CS else
22
消除左递归的一般方法

对产生式组

A→Aα1|Aα2|…|Aαn|β1|β2|…|βm

用如下产生式组替换


Aβ1 B|β2 B |…|βm B Bα1 B|α2 B |…|αn B|ε 其中:B为新变量,相当于A’


消除左递归的算法见P70的算法
为非终结符编号,再采用代入法将间接左递归变 为直接左递归,消除直接左递归
11
一个句子有两棵不同的语法树
S S E E S If a≠0 then if a>0 then b=1 else S S E If a≠0 then if E S S a>0 then b=1 else b=-1 S b=-1
三、重要问题——二义性及其消除

1.重写文法
S→U|M U→if E then S U→if E then M else U M→if E then M else M|other S→TS|CS C→if E then T →CS else 2015-3-29
2015-3-29
10
三、重要问题——二义性及其消除
再例:If语句 S→if E then S S→if E then S else S S→other 设执行下列语句前b=0, If a≠0 then if a>0 then b=1 else b=-1 当a=1时,b=1;当a=-1时,执行后b=-1 If a≠0 then if a>0 then b=1 else b=-1 当a=1 时,b=1;当a=-1时,执行后b=0 2015-3-29
自动机识别语言

自顶向下
算符优先分析法
Bottom Up LR(0)、SLR(1)[LR(1)、LALR]
2015-3-29 4
自底向上
4.2 自顶向下分析面临的问题与CFG 的改造


一、自顶向下的分析 从文法的开始符号出发,寻求所给的输入符 号串的最左推导 从树根S开始,构造所给输入符号串的语法树 例:G为:S→xAy A→**|*,输入串:x**y
三、重要问题——左递归及其消除


无法根据左递归文法进行自顶向下的分析 A a1a2……ai……an 直接左递归

A Aα
当前变量
输入指针
(栈顶、最左变量)
间接左递归 A+Aα
左递归的消除方法
将A→Aα
2015-3-29
|β 替换为A→β A′ 和 A′→α A′|ε
20
例:表达式文法直接左递归的消除
2015-3-29
32
候选式的确定与回溯(Backtracking)

给定文法S→cAd A→ab|e S c A e d 当需要用A派生时, 可以根据输入符号e唯 一的确定A的候选式
33
?句子ced是该文法定义语言的句子
2015-3-29
候选式的确定与回溯(Backtracking)

给定文法S→cAd
第 4章 自顶向下的语法分析 ( 1)
语法分析(Syntax Analysis) 文法的改造问题 自顶向下(Top Down)的分析 推导(Derivation)
2015-3-29 1
4.1 语法分析的任务

语法分析(Syntax Analysis)

检查扫描器输出的单词序列是否符合该语 言的文法(句子),并分析组成此句子的语法 成分 Parser Syntax Analyzer
2015-3-29 24
三、重要问题——提取左因子
将形如
A→αβ1|αβ2|…|αβm |γ1|γ2|… | γp
的规则改写为
A→αA' |γ1|γ2|… | γp和 A'→β1|β2|…|βm

结果:
S→ if E then SS’|other S'→ε|else S

2015-3-29
S→TS|CS|other C→if E then T →CS else
E → T E’ E ’→ + T E ’| ε T → F T’ T’→ * F T’|ε F → ( E )|id
候选式的确定与回溯(Backtracking)

给定文法S→cAd A→ab|e S c a A b d 出现一次虚假的匹配, 并且立即发现cad不是 合法句子
?句子cad是该文法定义语言的句子


对于不同的文法,可用不同的分析方法

多用于编译的手工实现 多用于编译的自动生成
27

LR文法 ── LR分析法

2015-3-29
4.3 自顶向下的分析方法

基本思想

寻找输入符号串的最左推导 试图根据当前输入单词确定使用哪个产生式

基本过程

从S出发,构造输入符号串(Token)的最左派生 从根开始,按与最左推导相对应的顺序,构造 输入符号串(Token)的语法分析树
相关文档
最新文档