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

合集下载

语法分析-自顶向下分析

语法分析-自顶向下分析
例 S::=aABbcd|ε A::=ASd|ε B::=SAh|eC|ε C::=Sf|Cg|ε 求此文法的每一个非终结符号的FIRST集。
解: FIRST(S)=FIRST(aABbcd)∪FIRST(ε) ={a}∪{ε}={a,ε} FIRST(A)=FIRST(ASd)∪FIRST(ε) ={a,d}∪{ε}={a,d,ε} FIRST(B)=FIRST(SAh)∪FIRST(eC) ∪FIRST(ε) ={a,d,h}∪{e}∪{ε}={a,d,h,e,ε} FIRST(C)=FIRST(Sf)∪FIRST(Cg) ∪FIRST(ε) ={a,f}∪{a,f,g}∪{ε}={a,f,g,ε}
4.1自顶向下的分析方法(P61)
开始符号 输入符号串
自顶向下的分析方法就是从文法的开始符号出发,按最左推导方式向下推导,试图推导出要分析的输入串。即:
开始符号 输入符号串
自底向上的分析方法从输入符号串开始,按最左归约方式向上归约到文法的开始符号。即:
+ 归约 ←
自底向上
文法符号的FIRST集合构造方法:
对于文法中的符号X∈V,其FIRST(X)集合可反复应用下列规则计算,直到其FIRST(X)集合不再增大为止: 若X为终结符,则将X加入FIRST(X)集合中。 若X为非终结符,且具有形如X→aα的产生式(a∈Vt),或具有形如X→ε的产生式,则把a或ε加进FIRST(X)。 设X为非终结符且有形如X→Y1Y2…Yk的产生式,若Y1∈Vn,则把FIRST(Y1)中的一切非ε符号加进FIRST(X);对于一切2≤i≤k,若Y1,Y2,…,Yi-1均为非终结符号,且ε∈FIRST(Yj),1≤j≤i-1,则将FIRST(Yi)中的一切非ε符号加进FIRST(X);但若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。

第四章 自顶向下的语法分析-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
递归下降语法分析程序如下:

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

第4章+自顶向下语法分析方法
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β是一个产
A→aAp|d
B→aBq|e
结论
不一定每个文法的左公共因子都能在有限的步 骤内替换成无左公共因子的文法。
一个文法提取了左公共因子后,只解决了相同 左部产生式右部的FIRST集不相交问题,当改 写后的文法不含空产生式,且无左递归时,则 改写后的文法是LL(1)文法,否则还需用LL(1) 文法的判别方式进行判断才能确定是否为LL(1) 文法。
B→d
B→d
考虑对输入串adbcbcbc#的分析
消除直接左递归
A→Aα1| Aα2|…| Aαm|β1|β2|…|βn 其中: αi 不等于ε , βj不以A开头。 改为: A→ β1A'| β2A' |…| βnA' A'→ α1A' | α2A' |…| αmA' |ε
消除间接左递归
将间接左递归变为直接左递归,然后消除直接 左递归。
如果两个产生式有相同的左部,它们的右部是由不 同的终结符或非终结符开始。
文法中无空产生式
定义4.1 设G=(VT,VN,P,S)是上下文无关文法
FIRST()={a|
*
a,a∈VT,
,∈V*}

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)则试着分析 所有的可能输入,当一种可能失败时就要求输入中备份任 意数量的字符。

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

编译原理 第四章自顶向下语法分析法
若b不∈FIRST(αi),其中i=1~n,则语法错,转出错处理。这样就避免了分析过程的回溯。
若文法的任一非终结符号,其规则右部的各个选择所能推出的终结符号串的头符号集合不满足两两相交的条件时,那么,要构造一个不带回溯的自顶向下的语法分析程序,需要采取什么措施呢?一般可采取改写文法的办法来解决。
(三)改写文法当文法不满足,可改写文法
对每一文法符号X∈V计算FIRST(X)。
(a)若X∈VT,则FIRST(X)={x}
(b)若X∈VN,且有产生式X→a…,a∈FIRST(X)。
(c)若X∈VN,X→ε,则ε∈FIRST(X)。
(d)若X∈VN,Y1,Y2,…,Yi都∈VN,而有产生式X→Y1Y2…Yn。当Y1,Y2,…,Yi-1都 ε时,(其中1≤i≤n),则FIRST(Y1)-{ε},FIRST(Y2)-{ε},…,FIRST(Yi-1)-{ε},FIRST(Yi)都包含在FIRST(X)中。
二、存在问题及解决办法
(一)左递归问题
自顶向下分析法只有规则排列得合适时,才能正确工作。该法的一个基本缺点是不能处理具有左递归的文法。如下所示。
如:直接左递归和间接左递归
无法确定语法树的终止,
清除直接左递归的较好方法是改
为右递归
如:S→Sa|b改为
S→bS′
S′→aS′|ε
一般情况下,直接左递归的形式可为:
为了自上而下地构造w的语法树,我们首先按文法的识别符号产生根结点S,并让指示器IP指
向输入串的第一符号c。然后,用S的规则(此处左部为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是否还有别的选择。

自顶向下的语法分析

自顶向下的语法分析

自顶向下的语法分析语法分析是自然语言处理中的一个重要组成部分,它的目的是将输入的文本归类为句法成分,并建立句法结构,从而实现对输入文本对句子中实体的抽取和理解。

为了解决自然语言处理中句法分析的问题,目前主要有两种常用技术:自顶向下技术(Top-Down)和自底向上技术(Bottom-Up)。

自顶向下技术指的是从句子的原始形式出发,通过层层分解直至分解完毕,或者说从大的结构框架出发,向下逐步分解,最终分析细节的技术。

该方法类似于程序设计中的自顶向下的程序设计方法,根据结构语法,句子可以被分解为更小的句子,句子又可以被分解为词语,而词语可以被分解为不同的词类。

通过分解和分析,可以建立语句的句法树形结构,从而得到词语、句子的结构等信息。

自顶向下句法分析的思想,即从整体分析向小部分分析,继而从整个句子到语法结构的分析,再从宏观结构到微观结构的分析。

自顶向下的语法分析有许多优点值得赞赏,其中一个优点就是它可以用相对简单的算法实现。

由于不需要存储较多句子结构,因此使用自顶向下语法分析可以节省存储空间,也更容易实现。

另外,在某些语法结构上,自顶向下语法分析也会比自底向上更加准确和可靠。

但是,它存在一些缺点,一是该方法只能处理少量的结构,无法处理复杂句法结构,二是它的分析速度很慢,不易开发。

要实现自顶向下的语法分析,首先要定义一个语言和句子的结构,这样才能将句子拆分成各个成分。

这里可以使用一些语法抽象的概念来描述抽象语法结构,或者使用终结符和非终结符表示句子的组成要素。

之后,可以建立一个语法分析树,对语句进行自顶向下的递归分析,最终得到抽象语法结构。

自顶向下的语法分析在自然语言处理中发挥着重要作用,它有助于理解输入文本的句子结构,从而提取实体信息。

在计算机科学里,语法分析使用自顶向下技术是一个有效的办法,可以帮助程序员更好地理解程序,更容易开发程序。

因此,自顶向下的语法分析技术可以为我们提供解决自然语言处理问题的方法。

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

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

第4章 自顶向下的语法分析
4.1 语法分析概述 4.2 自顶向下的语法分析面临的问题 与文法的改造 4.3 预测分析法 4.4 递归下降分析法 4.5 本章小结
2018/8/8 2
语法分析的功能和位置
语法分析(syntax analysis)是编译程序的核心部分, 其任务是检查词法分析器输出的单词序列是否是源语 言中的句子,亦即是否符合源语言的语法规则。


从文法的开始符号出发,寻求所给的输入符号串 的一个最左推导。 从树根S开始,构造所给输入符号串的语法树

例:设有G:S→xAy A→**|*,输入串:x**y
SxAy S x A
x**y
y
5
2018/8/8
4.2.1 自顶向下分析面临的问题
1.二义性问题
对于文法G,如果L(G)中存在一个具有两棵或两棵以上 分析树的句子,则称G是二义性的。也可以等价地说: 如果L(G)中存在一个具有两个或两个以上最左(或最右) 推导的句子,则G是二义性文法。 如果一个文法G是二义性的,假设wL(G)且w存在两个 最左推导,则在对w进行自顶向下的语法分析时,语法 分析程序将无法确定采用w的哪个最左推导。 Gexp: EE+T | E-T| T TT*F | T/F | F FF↑P | P Pc | id | (E) 解决办法:改造文法,引入新的文法变量
2018/8/8 8
4.2.1 自顶向下分析面临的问题
3.左递归引起的无穷推导问题 + 假设A是文法G的某个语法变量,如果存在推导A αAβ, 则称文法G是递归的,当 α=ε时称之为左递归;如果A + αAβ至少需要两步推导,则称文法 G是间接递归的,当 α=ε时称之为间接左递归;如果文法G中存在形如 AαAβ的产生式,则称文法G是直接递归的,当α=ε 时称之为直接左递归。 Ger:ET EE+T EE-T TF TT*F TT/F F(E) Fid 考虑为输入串id+id*id建立一个最左推导 EE+TE+T+TE+T+T+T……
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

其中α和β为任意语法符号串。
一、消除公共前缀
——用提左公因子法消除公共前缀。 A → α β | αγ | a 则可把它们变换为如下产生式: A →αA′ | a A′→β | γ 例 : S → id = E S → id (L ) L→E L→E ,L 通过提因子法可得到如下产生式: S → id S′ S′ → = E S′ → (L ) L → E L′ L′→ , L L′→ ε
→if E then S’→else S S’→ε
S S’
利用FIRST,FOLLOW 和 SELECT 解决问题!
一、集合FIRST、FOLLOW与SELECT的构造
若 Aβ,A∈VN ,β∈(VN∪VT) *
(1)求FIRST(β)的算法
(1)求FIRST(β)的算法
①若β∈VT,则FIRST(β)={β} ②若β∈VN, <a>若有产生式β t…, t∈VT, FIRST(β)∪{ t } <b>若有β ε, 则FIRST(β)∪{ε}。 <c>若有β X1 X2 … Xn , X1 ∈ VN, 则 加入FIRST(X1)-{ ε }; 若FIRST(X1)…… FIRST(Xi)都包含ε,则 加入FIRST(Xi+1)-{ε}; 如果FIRST(X1)…… FIRST(Xn)都包含ε,则 加入{ε}。 ③若β∈(VN∪VT) * ,即β= X1X2 … Xn, 加入FIRST(X1)-{ ε }; 若FIRST(X1)…… FIRST(Xi)都包含ε,则 加入FIRST(Xi+1)-{ ε }; 若FIRST(X1)… … FIRST(Xn)都包含ε,则 加入{ ε }。
例,分别识别 符号串1 “aaubb$” 符号串2 “aadbb$” 符号串3 “adubb$” 符号串4 “aaudb$”
假设有文法: S-->Ac {a,c} A-->B {a} A-->ε {c} B-->a {a}
递归下降子程序结构如下: void S() { A( ); token(c); } void A( ) { switch(symb){ case a: B( );break; case c: break; default: error( ); } } void B() { token(a); } void main() { next(symb); S( ); }
2. A β1|β2|…|βn void A() { if( symb∈P1) ε(β1) else if( symb∈P2 ) ε(β2) else
SELECT(A
β1)
…… if (symb∈Pn ) ε(βn)
else } Error(#k);
①βn∈VT: token(βn ); ②βn∈ VN:调用βn 子程序 ③βn是符号串(Y1Y2… YN) : ε(Y1);ε(Y2);…ε(YN)
第5章 自顶向下语法分析方法
5.1 5.2 5.3 5.4 5.5 确定的自顶向下分析思想 LL(1)文法的判别 某些非LL(1)文法到LL(1)文法的等价变换 不确定的自顶向下分析思想 确定的自顶向下分析方法
§5.1 确定的自顶向下分析思想
例:设文法G[S]: S-->aBc|bCd B-->eB|f C-->dC|c 试检查符号串 aefc 是不是该文法的句子。 例: E TE’ 如何选择产生式? E’ + TE’ E’ ε T FT’ T’ * FT’ T’ ε F(E) F id 对于输入id+id*id 的自顶向下的语法分析过程。
左递归会使分析进入到无限循环之中。
1.消除直接左递归 AAα1 | … | Aαn|β1| … |βm (直接改写法)
A→A ( α1 |......| αn ) | ( β1 | .......| βm ) 若令α=( α1 |......| αn ),β = ( β1 | .......| βm ), 则 A→A α | β ==> A→ β A′ A′→ α A′ | ε 再把α和β分别替换成( α1 |......| αn )和 ( β1 | .......| βm ), 则 A→ ( β1 | .......| βm ) A′ A′→ ( α1 |........| αn ) A′ A′→ ε 即: A→ β1 A′ | .......| βm A′ A′→ α1 A′ |........| αn A′ A′→ ε
假设有文法 Z→aBa 例,识别符号串abca$。 B→bB B→c void Z() { token(a);B();token(a); } void B() void B() { switch (symb) { switch (symb){ { case b:token(b);B();break; case b: next(symb);B();break; case c:token(c);break; case c: next(symb);break; default:Error();} default:Error();} } } void main() { next(symb);Z();}
A =>aA =>abA =>abcAB =>abcB =>abcdC
§5.3 LL(1)文法的等价变换
以下情况无法选择产生式:
1. 某个非终极符A有如下的两个产生式: A→αβ,A→αγ (即有公共前缀) 2. 某个非终极符A有直接左递归产生式: A→A α | ......
பைடு நூலகம்
例:A→A α
A→β
例 : E →T + E E →T T →F× T T →F F → id F→(E) 变换后得到如下产生式(左右等价): E → T E′ E → T E′ E′→ + E E′→ + T E′ E′→ ε E′→ ε T → F T′ T → F T′ T′→ × T T′→ × F T′ T′→ ε T′→ ε F →id F → id F→(E) F→(E)
例,考虑文法: S Aa|b A Ac|Sd|ε
§5.5 确定的自顶向下分析方法
一、递归子程序法
主要原理:对每个非终极符按其产生式结构产生相应 的以该非终极符为名的语法分析子程序,其中对终极符 产生匹配命令,对非终极符则产生子程序调用命令。因 为文法递归,相应子程序也递归,所以称这种方法为递 归子程序方法或递归下降法。
FOLLOW
例:SELECT(S A)=
SELECT(A BA’)= SELECT (A’ iBA’)= SELECT (A’ ε)= SELECT (B CB’)= SELECT (B’ +CB’)= SELECT (B’ ε)= SELECT (C )A*)= SELECT (C ( )=
例1:有文法G(S) S →BA A →BS A →d B →aA B →bS B →c 试写出其FIRST集。
FIRST(S)={a,b,c} FIRST(B) ={a,b,c} FIRST(A) ={a,b,c,d}
(2)求FOLLOW(A)
(a)对文法的开始符S,令$∈FOLLOW(S) (b)若B xAy,则FIRST( y)-{ε}∈FOLLOW(A) (c)若B xA,或 B xAy且ε∈FIRST( y),则 FOLLOW(B)∈FOLLOW(A)
二、文法的左递归性
如果文法G中有一个非终结符A,使得对某个字符 串α,存在推导A=>+A α,则称文法G是左递归的。 如果A→A α,则称文法G是直接左递归的。 如果A→αA ,则称文法G是直接右递归的。
例:下面是描述算术表达式的 文法。 S→E E→E+T|T T→T*F|F F→(E)|id 为句子 id*id+id 构造分析树 S E E E E : + + T + T T
例:文法G:A->aBbD D-->BB B-->b|ε Vocabulary {A,D,B,a,b } Epsilons A D B
change
a
b
Production A->aBbD D-->BB B-->b B-->ε
LH A D B B
RH aBbD BB b ε
m 4 2 1 0
例:S
例: V → id | V [ E ] | V .id | V↑ ==> V → V ( [ E ] | . id | ↑ ) | id ==> V→ id V′ V′→ ( [ E ] | . id | ↑ ) V′ | ε ==> V → id V′ V′ → [ E ] V′ | . id V′ | ↑ V′ V′ → ε
FIRST和FOLLOW的用处
例: A→ aA A→ bA A→ cAB A→ ε B → dC …… FIRST(aA)={a} FIRST(bA)={b} FIRST(cA)={c} FIRST(ε)={ε} FOLLOW(A)={d,$} FIRST(B)={d}
对句子abcd…..进行分析
例,消除该文法的左递归: A-->[B B-->X]|BA X-->Xa|Xb|a|b 消除直接左递归后: A -->[B B -->X]B’ B’-->AB’|ε X -->aX’|bX’ X’-->aX’|bX’|ε
2.消除间接左递归 A
Bα|β
B
Aγ|b
首先变换成直接左递归 即A(Aγ|b)α|β Aγα|bα|β
例如,A-->cA
1.基本动作 next(symb):把下一个Token读到symb中。 token(a):if(symb==a) next(symb); else error(#n); 例:S while E do S
相关文档
最新文档