第一节 语法分析概述
1.1 语法分析的任务
对源程序经过词法分析后转换称的符号串(即单词符号的序列)进行分析,根据语法规则,判断它是否是一个正确的句子。如果是,可以构造出一个提现句子结构的语法树;如果不是,可以输出相应的错误提示。
1.2 语法分析的分类
-
自上而下的语法分析
-
自下而上的语法分析
1.3 语法分析具体方法
-
自上而下的语法分析方法
1.1 回溯分析法
1.2 递归下降分析法
1.3 预测分析法 -
自下而上的分析法
2.1 算符优先分析法
2.2 LR分析法
第二节 回溯分析法
2.1 分析过程
回溯分析法实际上是一种试探的方法。当遇到多个欧萱产生式时,可以选择任意一个进行尝试,如果尝试失败,则回溯到试探前的状态,继续尝试其他候选。
回溯分析法的分析效率是非常低的。特别是当匹配失败发生在多级试探后,逐级回溯的开销是令人难以忍受的。
2.2 引起回溯的原因
2.3 消除公共左因子
2.4 消除直接左递归
根据能生成的串,设计新的文法使得左递归消失且效果不变
2.5 消除间接左递归
消除间接左递归的算法
算法实例
第三节 递归下降分析法
如果一个文法不含公共左因子和左递归,则可能(仅是可能)构造一个不带回溯的自上而下的分析程序。该程序由一组递归函数组成,每个函数对应一个非终结符,对该非终结符的产生式右端的符号一次进行匹配,匹配方式为:
1.如果是终结符,则检查输入串中的当前符号是否与该终结符一致;
2.如果是非终结符,则调用该非终结符对应的函数;
3.如果产生式右端是空串 ε \varepsilon ε, 则直接返回。
- 实例
对应视频地址
第四节 预测分析法
4.1 预测分析过程
初始时,输入指针执行啊输入串的第一个符号,# 和文法开始符相继入栈;然后比较栈顶符号 X 和输入符号 a, 根据比较结果确定采取的动作:
4.2 预测分析程序的结构
4.3 预测分析表
4.4 预测分析过程
4.5 预测分析表的构造
文法的FIRST集
文法的FOLLOW集
预测分析表构造算法
4.5.1 文法的FIRST集
4.5.2 文法的FOLLOW集
4.5.3 预测分析表的构造
LL(1)文法
自下而上分析法
第五节 算符优先分析法
5.1 算符文法
并不是通用文法,只针对
算符文法:
上下文无关文法G, 如果没有形如
P
−
>
ε
P-> \varepsilon
P−>ε 和
P
−
>
.
.
.
Q
R
.
.
.
P->...QR...
P−>...QR...的产生式,则称G为算符文法。
即不推导空串及连续非终结符
5.2 优先关系
只需判断相邻运算符优先关系,语法树中层次越高优先级越高
5.3 算符优先关系表
5.4 算符优先分析过程
算符优先分析法不重视非终结符,重视终结符
5.5 算符优先关系表的构造
文法的FIRSTVT集
P能够推导出的第一个终结符
文法的LASTVT集
P能够推导出的最后一个终结符
5.6 算符优先文法
局限性
第六节 LR分析法
最实用的语法分析法,目前大多数编译器采用的
6.1 LR分析程序的结构
6.2 LR分析表
例如:
6.3 控制程序