编译原理第五章
编译原理chapter5

若S+ …X,则X•>#。
第五章 优先分析法
第二节 简单优先分析方法
三、简单优先分析的基本思想
根据优先关系的定义,将简单优先文法中各 文法符号之间的这种关系用一个矩阵表示,称 作简单优先矩阵。PDA读入一个单词后,比较 栈顶符号和该单词的优先级,若栈顶符号优先 级低于该单词,继续读入;若栈顶符号优先级 高于或等于读入符号,则找句柄进行归约,找 不到句柄就继续读入。直到最后栈内只剩下开 始符号,输入串读到“#”为止。此时识别正 确。
1、自下而上归约
2、规定算符(更一般地说,指终结符)的优先级 及结合规则,以使得分析过程唯一
3、比较相邻两个算符而决定动作
注:1)这里的关键是对所有算符定义某种优先 关系
2)算符优先分析法是仿效四则运算的计算过 程而构造的一种语法分析方法
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
4、实例 表达式文法:
第五章 优先分析法 第二节 简单优先分析方法
四、简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
注:简单优先矩阵的构造可通过Warshall算法实 现。
第五章 优先分析法 第二节 简单优先分析方法
五、简单优先分析法的优缺点
优点:技术简单 缺点:适用范围小,分析表尺寸太大。
第五章 优先分析法 第三节 算符优先分析方法 一、基本思想
设A1A2…Ai-1AiAi+1…An是文法G的一个句型, 1)、若AiVN,则Ai-1、Ai+1 VT,即不许出现相继两个
非终结符;
第五章 优先分析法
第三节 算符优先分析方法 四、算符优先文法及优先表的构造 3、算符文法和算符优先文法定义的意义
编译原理课件Chapter_5

•
结点N的属性值由N的产生式所关联的语义规则来定义 通过N的子结点或N本身的属性值来定义
结点N的属性值由N的父结点所关联的语义规则来定义 依赖于N的父结点、N本身和N的兄弟结点上的属性值 不允许N的继承属性通过N的子结点上的属性来定义, 但允许N的综合属性依赖于N本身的继承属性 终结符号有综合属性 (来自词法分析),但无继承属性
–
每个语义规则都根据产生式体中的属性值来计算头部 非终结符号的属性值
栈中的状态/文法符号可以附加相应的属性值 归约时,按照语义规则计算归约得到的符号的属性值 要求副作用不影响其它属性的求值 没有副作用的SDD称为属性文法
•
S属性的SDD可以和LR语法分析器一起实现
– –
•
语义规则不应该有复杂的副作用
•
•
•
抽象语法树的表示方法
– –
叶子结点中只存放词法值 内部结点中存放了op值和参数 (通常指向其它结点)
30
构造简单表达式的抽象语法树的SDD
属性E.node指向E对应的抽象语法树的根结点
31
表达式抽象语法树的构造过程
•
输入
•
a–4+c
•
步骤
p1 = new Leaf(id, entry_a); p2 = new Leaf(num, 4); p3 = new Node('–', p1, p2); p4 = new Leaf(id, entry_c); p5 = new Node('+', p3, p4);
–
–
9
语法分析树上的SDD求值 (1)
•
•
实践中很少先构造语法分析树再进行SDD求值, 但在分析树上求值有助于翻译方案的可视化,便 于理解 注释语法分析树
编译原理第五章 (1)

简单优先分析算法要点
找第一个使Sj⊳Sj+1的Sj 从Sj开始往前(左)找第一个使Si-1⊲Si的Si
用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。
简单优先分析实例
优先关系矩阵 一个文法的全部优先关系可以用矩阵来表示,Biblioteka 称作优先关系矩阵。
例: Z bMb Ma M (L L Ma)
Z FIRST b LAST b M a, ( a ,L, ) L M, ( , a )
Z FIRST b 例: Z bMb LAST b
文法优先关系的确定 FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}
若有U…SiSj…: 则有Si Sj ; 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, SFIRST(Z),有# ⊲ S,; 且# ⊲ Z SLAST(Z),有S ⊳ #,; 且Z ⊳ #
符号栈 # #b #b( 关系 输入流 b(aa)b# (aa)b# aa)b#
#b(a #b(M #b(Ma #b(Ma)
#b(L #bM
⊲ ⊲ ⊲ ⊳
a)b# a)b# )b# b#
b# b#
例: Z bMb Ma M (L L Ma)
编译原理第5章

二.算符优先分析法的基本思路
是仿照算术表达式的四则运算过程而设计的一 种语法分析方法。
终结符号 运算符 非终结符号 运算对象 算符优先分析法的关键在于用合适的方法去定义 任何两个可能相继出现的结符号a和b(它们之间 可能插有一个非终结符号)之间的优先级。然后利 用这种关系比较相邻运算符之间的优先级来确定 可归约串并进行归约。
bcde#
归约Ab
4
#aA
bcde#
移进
5
#aAb
cde#
归约AAb
6
#aA
cde#
移进
7
#aAc
de#
移进
8
#aAcd
e#
归约Bd
9
#aAcB
e#
移进
10
#aAcBe
# 归约SaAcBe
11
#S
#
接受
5.2算符优先分析法 概述 一. 算符文法的定义 二. 算符优先分析法的基本思想
算符优先分析法概述
第五章 自底向上分析
P94
概论
▪ 思想
• 自下而上的语法分析过程是最右推导的逆过
程(最左归约);即从输入串开始,朝着文 法开始符号进行归约,直至到达文法开始符 号为止的过程。
▪ 核心
• 寻找句型中的“句柄”进行归约,用不同的
方法寻找句柄,就可获得不同的分析方法
5.1 自底向上分析
一、规范归约
•归约 G=(VT,VN,S,P),α, β ∈(VT∪VN)*,A→β∈P,
规范句型的特点:
生式如下:
①S→aAcBe
②A→b
句柄后不会出现非终结符号。
③A→Ab
④B→d
对输入串abbcde#进行分析
编译原理第5章

语法分析-自下而上分析 语法分析-
E E T | E+T T F | T*F F i | (E) E + T 短语有:i, T * F, E+T * F, E + T * F + i 直接短语有: i, T * F 句柄是:T * F
第7页
E + T F
T *
F
i
编译原理
语法分析-自下而上分析 语法分析-
接短语
*
位于一个句型最左边的直接短语称为句柄. 句型最左边的直接短语称为 位于 句型---> 短语 ---> 直接短语 --->句柄 句型 句柄
注: 每次归约的部分必须是称之为句柄 句柄的字符串(最右 句柄 推导)。 关键的问题是如何识别句柄 如何识别句柄
第6页
编译原理
例:下述文法的另一个句型: 下述文法的另一个句型: E+T * F + i 其短语、直接短语、句柄分别是? 其短语、直接短语、句柄分别是?
第17页
T *
F
i
编译原理 算符优先分析法小结
优点 简单、效率高 能够处理部分二义性文法 缺点 文法书写限制大 占用内存空间大 不规范、存在查不到的语法错误
语法分析-自下而上分析 语法分析-
第18页
编译原理
语法分析-自下而上分析 语法分析-
LR分析法 LR分析法
L表示从左到右扫描输入串,R表示构造一个 表示从左到右扫描输入串, 表示构造一个 表示从左到右扫描输入串 最右推导的逆过程。 最右推导的逆过程。 大多数用上下文无关文法描述的程序语言都 可用LR分析器予以识别 分析器予以识别。 可用 分析器予以识别。 能用I.R分析器分析的文法类 包含能用LL(1) 分析器分析的文法类, 能用 分析器分析的文法类,包含能用 分析器分析的全部文法类, 分析法在自左 分析器分析的全部文法类,LR分析法在自左 至右扫描输入串时就能发现其中的任何错 并能准确地指出出错地点。 误.并能准确地指出出错地点。
编译原理 第五章

一个文法符号串的开始符号集合定义如下: 定义5.1 设G=(VT,VN,S,P)是上下文无关文法 FIRST(α)={a|α aβ,a∈VT,α,β∈V*} 若α ε,则规定ε∈FIRST(α).
不难求出在例5.2文法G2中 FIRST(Ap)={a,c} FIRST(Bq)={b,d} 因此有 FIRST(A)∩(FIRST(B)= 这样文法G2中,关于S的两个产生式的右部虽然都以非 终结符开始,但它们右部的符号串可能推导出的首符号集 合不相交,因而可以根据当前的输入符号是属于哪个产生 式右部的首符号集合而决定选择相应产生式进行推导,因 此仍能构造确定的自顶向下分析。
定义5.4 一个上下文无关文法是LL(1)文法的充分 必要条件是:对每个非终结符A的两个不同产生式, A→α, A→β,满足 SELECT(A→α)∩SELECT(A→β)= 其中α,β不同时能 ε。
LL(1)文法也可定义为: 一个文法G是LL(1)的,当且仅当对于G的每 一个非终结符A的任何两个不同产生式 A→α|β, 下面的条件成立: ① FIRST(α)∩FIRST(β)= ,也就是α和 β推导不出以某个相同的终结符a为首的符号串; 它们不应该都能推出空字ε. ② 假若β ε那么, FIRST(α)∩ FOLLOW(A)= 也就是,若β ε 则α所能推出的串的首符号不应在FOLLOW(A) 中(如例5.3)。这种表示与定义5.4相比计算步骤 少,但不如定义5.4清晰。
编译原理 第9讲第五章 优质课件

LL(1)文法判别
LL(1)文法(充分必要条件) 一个上下文无关文法G是LL(1)的,当且仅当对于G的每一个非终结符
A的任何两个不同产生式A α β ,下面的条件成立: 1.FIRST(α )∩FIRST(β )=,也就是α 和β 推导不出以同一个终结
符a为首的符号串;它们不应该都能推出空字. 2.假若β =>* ,那么,FIRST(α )∩FOLLOW(A)=.
识别输入串w=ccap是否为该文法的句子 试探,推导过程:
S=>Ap=>cAp=>ccAp=>ccap 试探成功
文法特点: 产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,那么它们右部由不同的终结符或非终结符开始 没有空产生式
12
例子(3)
例:文法G1: S → aA | d
A → bAS | ε
3
语法分析
在语言的编译实现中,把句子分析的过程
称为语法分析,即完成这个任务的程序 称为语法分析程序或称为识别程序。分 析算法又称识别算法。 从左到右的分析算法,即总是从左到右地
识别输入符号串,首先识别符号串中的
最左符号,进而依次识别右边的一个符
号,直到分析结束。
4
分析算法分类
自上而下分析法:
从文法的开始符号出发,寻找与输入符 号串匹配的推导,或者说,为输入串寻 找一个最左推导。
这时
w的第二个符号可以与叶子 结点a得以匹配,但第三个 符号d却不能与下一叶子结 点b匹配
怎么办?-查看A有无另一个选 择,有!回溯,把A为根的 子树剪掉,扫描过的输入串 中的a吐出来,再试探用产生 式(3)构造推导S cAd cad
识别输入串w=caa的过程: 1.S cAd 2.选择(2)扩展A,得到推导S cAd
编译原理-第五章习题答案

上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)
栈
# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT
上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章
2.对下面的文法G:
E→TE/
E/→+E|ε
T→FT/
T/→T|ε
F→PF/
F/→*F/|ε
P→(E)|a|b|^
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2)证明这个方法是LL(1)的。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。
解:
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
FIRST集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(E/)={+,ε}
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(T/)=FIRST(T)∪{ε}={(,a,b,^,ε};
FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(F/)=FIRST(P)={*,ε};
FIRST(P)={(,a,b,^};
FOLLOW集合有:
FOLLOW(E)={),#};
FOLLOW(E/)=FOLLOW(E)={),#};
FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};//不包含ε
FOLLOW(T/)=FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};
FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};//不包含εFOLLOW(F/)=FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};
FOLLOW(P)=FIRST(F/)∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε(2)证明这个方法是LL(1)的。
各产生式的SELECT集合有:
SELECT(E→TE/)=FIRST(T)={(,a,b,^};
SELECT(E/→+E)={+};
SELECT(E/→ε)=FOLLOW(E/)={),#}
SELECT(T→FT/)=FIRST(F)={(,a,b,^};
SELECT(T/→T)=FIRST(T)={(,a,b,^};
SELECT(T/→ε)=FOLLOW(T/)={+,),#};
SELECT(F→PF/)=FIRST(P)={(,a,b,^};
SELECT(F/→*F/)={*};
SELECT(F/→ε)=FOLLOW(F/)={(,a,b,^,+,),#};
SELECT(P→(E))={(}
SELECT(P→a)={a}
SELECT(P→b)={b}
SELECT(P→^)={^}
可见,相同左部产生式的SELECT集的交集均为空,所以文法G[E]是LL(1)文法。
(3)构造它的预测分析表。
文法G[E]的预测分析表如下:
(4)构造它的递归下降分析程序。
对每个非终结符写出不带回溯的递归子程序如下:
char CH;//存放当前的输入符号
void P_E()//非终结符E的子程序
{
if(IsIn(CH,FIRST_TEP)) //FIRST_TEP为T→TE/ 的右部的FIRST集合,产生式E→TE/
{
P_T();
P_EP();
}
else ERR;
}
void P_EP()//非终结符E/的子程序
{
if(CH==’+’) //产生式E/→+E
{
READ(CH);
P_E();
}
else//产生式E/→ε
{
if(IsIn(CH,FOLLOW_EP)) //FOLLOW_EP为E/的FOLLOW集合
return ;
else ERR;
}
}
void P_T()//非终结符T的子程序
{
if(IsIn(CH,FIRST_FTP)) //FIRST_TEP为T→FT/ 的右部的FIRST集合,产生式T→FT/
{
P_F();
P_TP();
}
else ERR;
}
void P_TP()//非终结符T/的子程序
{
if(IsIn(CH,FIRST_T)) //FIRST_T为产生式T/→T的右部的FIRST集合,产生式T/→T
{
P_T();
}
else//产生式T/→ε
{
if(IsIn(CH,FOLLOW_TP)) //FOLLOW_TP为T/的FOLLOW集合
return ;
else ERR;
}
}
void P_F()//非终结符F的子程序
{
if(IsIn(CH,FIRST_PFP)) //FIRST_PFP为F→PF/ 的右部的FIRST集合,产生式F→PF/
{
P_P();
P_FP();
}
else ERR;
}
void P_FP()//非终结符F/的子程序
{
if(CH==’*’) //产生式F/→*F/
{
READ(CH);
P_FP();
}
else//产生式F/→ε
{
if(IsIn(CH,FOLLOW_FP)) //FOLLOW_FP为F/的FOLLOW集合
return ;
else ERR;
}
}
void P_P()//非终结符P的子程序
{
if(CH==’(‘)
{
READ(CH);
P_E();
if(CH==’)’) READCH(CH);
else
ERR;
}
else if(CH==’a’) READ(CH);
else if(CH==’b’) READ(CH);
else if(CH==’^’) READ(CH);
else ERR;
}
4证明下述文法不是LL(1)的。
S->C$ C->bA|aB A->a|aC|bAA B->b|bC|aBB 你能否构造一等价的文法,使其是LL (1)的,并给出判断过程。
【解】因为SELECT(A->a)∩SELECT(A->aC)≠Ф,根据LL(1)文法的判定条件:(1)文法不含左递归(2)对于文法U的任意两个不同的规则有: Select(U→α) ∩Select(U→)=Φ一个文法若满足以上条件,称该文法G为LL(1)文法。
得出该文法不是LL(1)文法。
该文法含公共因子,消除后的文法为:S->C$ C-> bA|aB A->aA'|bAA A’->C|εB->bB'| aBB
B’->C|ε【证明】因为SELECT(C-> bA) ∩SELECT(C->aB)= ΦSELECT(A->Aa) ∩SELECT(A->bAA) = ΦSELECT(A’->C) ∩SELECT(A’->ε)=(FIRST(C)-{ ε})∩FOLLOW(A’) ≠Ф因此消除公共因子后得到文法也不是LL(1)文法。