作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/16378956.html
自底向上优先分析
Notes:由于某符号打不出来,所以用≐代替等号中间一个点。
优先分析概述
移进—归约法:根据文法寻找句型的句柄
优先分析法:利用句型相邻两个符号之间的优先级关系确定句柄
if(x⋖≐ai)shift(ai);elseif(x⋗ai)reduce(A→...x);elseerror();

简单优先分析法
定义:设文法G=(VN,VT,P,S),则(VN∪VT)上的3种优先关系定义如下(二元关系):
- X≐Y,iffA→...XY...∈P;
- X⋖Y,iffA→...XB...∈P,B+⇒Y...;
- X⋗Y,iffA→...BD...∈P,B+⇒...X,D∗⇒Y...;
其中X,Y,D∈(VN∪VT),A,B∈VN,...∈(VN∪VT)∗。
特别地,句子括号#的优先级低于其右邻符号,其左邻符号优先级高于#;优先级关系在句型中相邻的符号,反映了归约时的优先关系:
- X≐Y:表示在句型中相邻出现的XY,同时被归约;
- X⋖Y:表示在句型中相邻出现的XY,X后于Y被归约;
- X⋗Y:表示在句型中相邻出现的XY,X先于Y被归约。
定义:文法G的符号集V中,任意两个符号之间至多存在≐,⋖,⋗三种简单优先关系之一,且没有相同右部的规则,则文法G称为简单优先文法。
关于简单优先文法,可以证明下列几个结论:
-
设文法G为简单优先文法,句型#a1a2...ai−1aiai+1...aj−1ajaj+1...an#,存在下列关系:
ai−1⋖ai≐ai+1≐...≐aj⋗aj+1,则子串aiai+1...aj−1aj是句型的直接短语。
-
设文法G为简单优先文法,如果输入串或归约后的符号串中相邻的两个符号之间不存在任何一种简单优先关系,则输入串不是文法的句子。
-
如果文法G是简单优先文法,则文法G是无二义性的文法。
简单优先分析法的思想
-
初始化:#入分析栈S,w#入输入栈I,#在栈底;
-
X=top(S);a=top(I);
-
if(x⋖≐ai)shift(ai);elseif(x⋗ai)reduce(A→...x);elseerror();
在S栈顶寻找以下关系序列,以确定句柄的首部:
ai−1⋖ai≐...≐X⋗a,确定句柄为ai...X,再用A→ai...X归约
-
重复2 3,直到归约出文法开始符S(#S)。
简单优先文法中任何两个符号之间优先关系保存在优先关系矩阵中。M[X,Y]存放3个优先关系符号≐,⋖,⋗和空白之一。
【例】

【例】




算符优先分析法
- 与简单优先分析法不同,算符优先分析法仅仅利用相邻的两个终结符之间优先关系寻找归约子串。这个归约子串不是句柄,但它是一种特殊的直接短语,被称为最左素短语。
- 这种分析法源于对表达式处理。表达式是计算机语言中最重要的、最核心的组成部分,其语法特点是表达式运算符合和运算对象组成。表达式组成是否符合语法,通常是以运算符的计算优先顺序和运算符需要运算对象个数进行判别的。
定义:设文法G=(VN,VT,P,S),如果G中没有形如A→...BC...的规则,其中A,B,C∈VN,则称文法G为算符文法(Operator Grammer
),简称OG文法
。
例如:表达式文法(有二义性的,无二义性但有左递归)均是OG文法。OG文法其实质是对规则进行了限制,也就是规则右部不得出现两个非终结符直接相邻。它是对表达式进行形式化和推广,终结符均为算符,非终结符视为运算结果。
- 性质1:在OG文法中任何句型都不包含两个相邻的非终结符。
- 性质2:如果Ab或bA出现在OG文法的句型γ中,其中A∈VN,b∈VT,则句型γ中任何包含此b的短语必含有A。
定义:设算符文法G=(VN,VT,P,S),VT上的3种算符优先关系定义如下:
- a≐b,iffA→...ab...∈P,或A→...aBb...∈P;
- a⋖b,iffA→...aB...∈P,B+⇒b...或B+⇒Cb...;
- a⋗b,iffA→...Bb...∈P,B∗⇒...a,B+⇒...aC;
其中a,b∈VT,A,B,C∈VN,...∈(VN∪VT)∗。
算符优先关系在句型中相邻的符号,反映了归约时的优先关系。即:
- a≐b:在句型中相邻出现的ab或aBb,同时被归约;
- a⋖b:在句型中相邻出现的ab或aBb,a晚于b被归约;
- a⋗b:在句型中相邻出现的ab或aBb,a先于b被归约。
定义:设不含空规则的文法G为OG文法,如果任意两个终结符之间至多存在≐,⋖,⋗三种运算符优先关系之一,则称文法G为算符优先文法(Operator Precedence Grammar
),简称OPG文法
。
【例】

算符优先文法是无二义性文法
定义:设文法G[S],其句型的素短语是满足下列两个条件的短语:
特别地,最左边的素短语称为最左素短语。
【例】

最左素短语定理:一个算符优先文法G的任何句型#N1a1N2a2...Ni−1ai−1NiaiNi+1ai+1...Nj−1aj−1NjajNj+1aj+1...Nnan#,其中ai都是终结符,Ni是可有可无的非终结符。该句型的最左素短语是满足如下条件的最左子串Niai...NjajNj+1:
- ai−1⋖ai≐...≐aj⋗aj+1
设文法G为算符优先文法,如果输入串货归约后的符号串中,相邻的两个符号之间,不存在任何一种算符优先关系,则输入串不是文法的句子。
如果文法G是算符优先文法,则文法G是无二义性的文法。
定义:设文法G=(VN,VT,P,S),则FIRSTVT(B)
和LASTVT(B)
定义如下:
- FIRSTVT(B)={a|B+⇒a...orB+⇒Ca...,a∈VT,C∈VN};
- LASTVT(B)={a|B+⇒...aorB+⇒...Ca,a∈VT,C∈VN};
FIRSTVT(B)
集计算方法:
- FIRSTVT(B)=∅;
- 扫描文法规则,对形如B→a...或B→Ca...规则,a∈VT,C∈VN,择FIRSTVT(B)∪={a};
- 扫描文法规则,对形如B→C...规则,C∈VN,则FIRST(B)∪=FIRSTVT(C);
- 重复3,直到FIRSTVT集不再扩大为止。
LASTVT(B)
集计算方法:
- LASTVT(B)=∅;
- 扫描文法规则,对形如B→...a或B→...aC规则,LASTVT(B)∪={a};
- 扫描文法规则,对形如B→...C规则,C∈VN,则LASTVT(B)∪=LASTVT(C);
- 重复3直到LASTVT集不再扩大为止。
基于FIRSTVT(B)
和LASTVT(B)
的运算符优先关系计算:
- 如果A→...ab...∈P或A→...aBb...∈P,a,b∈VT,B∈VN,则a≐b;
- 如果A→...aB...∈P,b∈FIRSTVT(B),a∈VT,B∈VN,则a⋖b;
- 如果A→...Bb...∈P,a∈LASTVT(B),b∈VT,B∈VN,则a⋗b。
【例】



定义:设文法G=(VN,VT,P,S),算符优先关系为≐,⋖,⋗,定义在VT→N+上的函数f和g满足下列条件,则文法G的f和g称为算符优先函数:
- a≐bifff(a)=g(b);
- a⋖bifff(a)<g(b);
- a⋗bifff(a)>g(b)。
优先函数与算符优先矩阵:2(|VT|+1) vs (|VT|+1)2。
算符优先函数的构造:
- 对a∈VT,置f(a)=g(a)=1;
- 对每个关系偶对<a,b>,按下列情况分别计算:
- 如果a≐b,f(a)≠g(b),则f(a),g(b)=max(f(a),g(b));
- 如果a⋖b,f(a)≥g(b),则g(b)=f(a)+1;
- 如果a⋗b,f(a)≤g(b),则f(a)=g(b)+1;
- 重复第二个步骤,直到f和g函数不再变化(或称过程收敛),或者f和g函数有值大于2|VT|为止。后一种情况判定f和g函数不存在。
【例】

算符优先分析法的优缺点:
算符优先分析法的主要应用场景:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!