第四章
语法分析器的功能
分析出单词符号串的基础上,程序的语法结构是否符合语法规则。
按文法的产生式识别输入的符号串是否为一个句子。
自上而下分析面临的问题
带回溯的分析,如果有左递归可能会无限循环,效率低,虚假匹配的问题,难以知道出错的位置。
LL(1)文法
左递归的消除
直接左递归
间接左递归
例子
消除回溯,提左公因子
LL(1)分析的思想
求取FOLLOW集
LL(1)文法的定义
递归下降分析程序
终结符:S();
非终结符:if(Sym == “+”) Advance();
预测分析程序
第五章
自下而上分析
基本思想
用文法左部去代替符合的右部
短语、直接短语和句柄
短语
短语是一个字符串的子串
直接短语
句柄
一个句型的最左直接短语
例子
规约的基本思想
形成了句柄就可与规约
规范规约
- 最左推导(规范推导)的逆过程:最右规约
- 最右推导的逆过程:最左规约(规范规约)
算符优先文法
用于做自下而上分析
算符优先文法的定义
算符优先关系
因为算符优先性代表着谁会先被规约掉
算符文法
即不可以两个非终结符挨在一起
算符优先关系定义
文法G中任意两个终结符(a,b)最多只能满足三种关系之一就是算符优先文法。
例子
算符优先关系表的构造
构造需要用到两个集合
- FirstVT集合算法
- LastVT集算法
例子
构造的如果无冲突,就是算符优先文法。
最左素短语
定义
- 素短语:是一个短语,至少包含一个终结符,且除自身之外不包含其他的素短语
- 最左素短语:位于句型最左边的(在树中来看)
例子
算符优先文法的句型
算符优先文法结构如下
算符优先分析算法
优先函数
f(a):栈内优先函数
g(a):比较优先函数(栈外(源程序)优先函数)
优先函数不等于优先关系表,有些优先关系表不存在优先函数,如果有一对优先函数f和g,就存在无限多对优先函数。
关系图法构造优先函数
LR分析法
LR分析器
组成
- 总控程序:不依赖于文法,依赖于分析表
- 分析表
- 分析栈:状态栈、符号栈
ACTION表
分析过程中执行的动作,有移进、规约、accept、出错。
GOTO表
用于跳转目标状态
LR(0)项目
前缀
符号串的任意部首,比如在abc中:空、a、ab、abc都是其部首。
活前缀
可归前缀
LR(0)项目
文法G的每条规则右部的任意位置上加上一圆点构成的项目。原点作用是进行分割,左边是在栈内的符号,右边是未进栈的符号。
构造识别文法活前缀的NFA
步骤
1、拓广文法
2、给出文法的所有LR(0)项目
3、将每一个项目连接起来
构造LR(0)项目集规范族
识别一个文法活前缀的DFA的项目集(状态)的全体
步骤
1、拓广文法并且求闭包closeure(I)
2、状态转换函数
例子
LR(0)分析表的构造
如果分析表没有冲突就是LR(0)文法,即每个位置只有一个动作。
LR分析
对上面的分析表进行LR分析
SLR(1)分析表的构造
规约项填的是对应产生式左部非终结符的FOLLOW集。
LR(1)项目集的构造
SLR(1)无法解决的移进、规约冲突,即相关集合相交。
LALR(1)分析表的构造
将LR(1)前部合并