目录
前言
重点一览
引言
语法分析的功能
语法分析的分类
自上而下分析方法
回溯分析法
回溯分析法例子
方法
存在的问题
产生的原因
特点
解决缺陷
消除回溯(重点)
递归下降分析器
递归下降分析法
递归过程的构造
扩充BNF
改进的递归下降分析法
预测分析法
预测分析表
⭐分析方法(重点)
⭐构造预测分析表(重点)
本章小结
前言
本复习笔记基于张老师的课堂PPT,供自己期末复习与学弟学妹参考用。
重点一览
引言
语法分析的功能
语法分析的分类
自上而下:从文法开始符出发,能否找到一个最左推导序列, 使得S=>*w ?
自下而上:从w出发,能否找到一个最左规约(最右推导的逆过程)序列,逐步向上规约,直至文法的开始符S?
自上而下分析方法
不确定的分析的方法:回溯分析法
确定的分析方法:递归下降分析法
回溯分析法
回溯分析法例子
方法
从文法的开始符号S出发; 选取S的候选式进行推导,接着按最左推导进行下去; 如果推导失败,再换用其他的候选式;——必然导致回溯 若穷尽所有的候选式都失败,则表明w不是G的句子,w存在语法错误。
存在的问题
回溯!!!!!!!!!!
产生的原因
(1) 公共左因子
(2) 左递归
(3) ε产生式
特点
回溯分析法是一种 不确定 的方法。 使用 试探 的方法穷举每一种可能,当分析不成功时则 回退 到适当位置再重新试探其余可能的推导。 穷尽 所有可能的推导,仍不成功 才能 确认输入串不是该文法的句子
解决缺陷
回溯分析法是一种 低效 的语法分析方法,在实际的编译器中很少使用 针对产生回溯的原因,提出 消除回溯 的方法; 引进确定的语法分析方法—— 递归下降分析法 和 预测分析法 。
消除回溯(重点)
1. 提取公共左因子
说人话:左因子写出来,右边跟个字母,字母另起一行,推出因子后面
2. 消除左递归(直接左递归与间接左递归)
① 直接左递归的消除
说人话: 没递归的拿到左边,统统后面加上字母,字母重新另起一行,推出递归字母或ε
② 间接左递归的消除
方法:把所有非终结符排序,依次循环代入形如A→Bα的产生式,将B用B的产生式右端代替,如此循环得到直接左递归,随后消除直接左递归即可。
例题:
递归下降分析器
如果文法没有公共左因子,也没有左递归,那么可能可以构造出没有回溯的递归下降分析器
分析程序由一组递归过程组成。
每个过程对应文法的一个非终结符
对相应的产生式的右部进行分析。
分析程序称为递归下降分析程序(器),其方法称为递归下降分析法
递归下降分析法
递归过程的构造
扩充BNF
左递归的消除
改进的递归下降分析法
预测分析法
将递归下降分析方法进行变化,可以得到更有效的方法——预测分析法
预测分析是一种表驱动的方法,它由下推栈、预测分析表和控制程序组成
其实质是预测每个候选式的匹配作用
预测分析表
形式:M[A,a]矩阵,A ∈ 𝑉𝑁 ,a ∈ 𝑉𝑡 ∪ {#}
内容:
◼ A→α:表示采用A→α匹配输入符号a, 或
◼ 出错标志(空白):表示A不可能匹配a。
目的:记录预测的结论。
穷举了ε出现的情况
⭐分析方法(重点)
预测分析器的控制程序根据
◼ 下推栈的栈顶符号x
◼ 当前的输入符号a
决定下一步应采取的动作
◼ 1.若x=a=#,
◼ 则符号串和栈均已为空;则输入串ω是该文法的一个合法句子分析过程结束。
◼ 2.若x=a≠#,
◼ 栈顶符号与输入符号匹配,则x出栈
◼ 输入指针指向下一个符号
◼ 这一次匹配成功,继续下一次匹配。
◼ 3.若X为非终结符,则查分析表。
◼ 若M[x,a]中存放 x→α,则x出栈,将α串逆序压入栈中(α的前缀处于栈顶位置)。
◼ 若M[x,a]中为出错标志,则调用出错处理程序error( )。
⭐构造预测分析表(重点)
构造一个文法的预测分析表,需要引进FIRST集和FOLLOW集
FIRST集
定义:由𝛼的所有可能推导的开头终结符及可能的𝜀组成的集合
大白话规则:终结符的FIRST集是包含它本身的集合;非终结符X能推出ε,则ε∈FIRST(X);非终结符X能推出终结符开头的串,则此终结符∈FIRST(X);非终结符X能推出终结符开头的串,那么此串开头的非终结符的FIRST集中的元素,除ε外,都∈FIRST(X)。
FOLLOW集
定义:实质上就FOLLOW(A)就是在考察A在产生式右端的出现情况,哪些终结符可以在A后面
大白话规则:文法的开始符号的FOLLOW集包含#;考察所有产生式的右端,非终结符X右边出现了串,就把后面串的除ε外的FIRST集元素加入FOLLOW(X);非终结符X右边没有字符或右边的字符可推出空元素(ε)时,将产生式左端的FOLLOW集中的元素给到FOLLOW(X)
构造算法(重点)
LL(1)文法
当进行分析时
◼ 如果仅利用当前的非终结符,
◼ 和向前查看1个输入符号,
就能唯一决定采取什么动作,
那么这个文法就是LL(1)文法。
LL=从左到右扫描,采用最左推导
(k)=向前看k位
并非所有文法G都可以改写成LL(1)文法,即使提取左公因子和消除左递归后,也不是LL(1)文法.
重点:判断是否为LL(1)文法:看预测分析表是否一格一产生式,如果一格多个产生式就不是。
本章小结
本章知识点都比较重要,尤其要掌握相关计算,大题中分析题中会考察!