一、语法分析器功能
在词法分析识别出的单词符号的基础上,分析并判定程序的语法结构是否符合语法规则。
二、语法分析工作方式
语法分析的过程:通过推导或者归约的方式构造一棵语法树。
- 推导:从文法的起始符出发进行句子的推导,即自上而下的分析。
- 归约:从句子本身出发,进行归约,看能否把句子约为到起始符,即自下而上的分析
三、自上而下分析的语法分析器的构造方法
- 递归下降分析程序
- 预测分析程序
四、自上而下分析面临的问题及解决
1、问题
- 文法的左递归问题。(直接左递归或间接左递归)
- 回溯的不确定性,要求我们将已经完成的工作推倒重来。
- 虚假匹配(自动匹配机制引起的)的问题。
- 不能准确的确定输入串中的出错位置。
- 效率低。
2、解决方法
通过将文法转化成 LL(1)型文法。L:left->right扫描;L:最左推导
2.1 消除左递归
对于非终结符 P,有两种的候选式,包含左递归 和 不包含左递归。
P-> Pa1|Pa2|…|Pa1m| b1| b2 |…| bn
引入 P’,拆分 P的候选式。
P -> b1 P’| b2 P’|…| bn P’ --不包含左递归。
P’->a1P’| a2P’| …| amP’| ɛ -- 包含左递归。
例子:
对于间接左递归,展开成直接左递归
2.2 提取公共左因子——解决回溯问题
要求:在使用非终结符对输入串进行匹配时,能根据输入字符准确地选择一个候选式。
即:对于任意终结符A 的所有候选式的First集两两不相交。
First集,又称终结符首符集:First(ɑ) 是候选式 ɑ 的所有可能推导的开头终结符或者可能的ɛ。
例如:FIRST(E) = FIRST(TE') = FIRST(T) = FIRST(F) = FIRST((E)) ∪ FIRST(i)={ ( , i }
特殊情况:
当文法:
E -> Tb | a
T -> c | ɛ
由于:First(T) = { c, ɛ },即 T -> ɛ,因此 E -> Tb ==> E -> b;
则First(Tb) = First(Tb) + First(a) = First(T) - ɛ + First(b) + First(a) = { c, b, a }
提取公共左因子:
2.3 Follow集——解决虚假匹配
造成原因:空字的自动匹配机制。
解决:对于候选式 含有空子 的非终结符,进行判定是否自动匹配。
Follow(非终结符):所有句型中出现在紧接A之后的终结符或‘#’。
计算Follow集:
- 对于文法起始符S,将‘#’置入Follow(S)。
- 对于A->ɑBβ,将 First(β) - ɛ 加入 Follow(B)。
- 对于A->ɑB,或者 A->ɑBβ且First(β)含有ɛ, 则 把 Follow(A) 加入 Follow(B)。
3、LL(1)文法
- LL(1)文法不含有左递归。
- 每一个非终结符的候选式,其First集两两互不相交。
- 对于具有A->ɛ的非终结符A,其 Follow(A) ∩ First(A) = ɸ。
五、基于LL(1)文法构造递归下降分析程序
一个非终结符编写一个含有递归的程序。
六、基于LL(1)文法构造预测分析程序
使用一张分析表和一个栈进行联合控制。
1、程序结构
- 执行程序(总控程序)
- 分析表
预测分析表:指导分析过程中候选式的选取。
- 符号栈
四种工作状态:开始状态【#, 起始符】、工作状态、出错状态、结束状态【#】
2、分析表的构造
- 计算First(非终结符)集合
对于产生式规则,将其填写到(非终结符,a)的表格中,其中a ∈ First(非终结符)
- 计算Follow(非终结符)集合
若First(非终结符)包含 ɛ,则将 非终结符 -> ɛ,填写到 (非终结符, b),其中b∈Follow(非终结符)。
- 空白出填写出错标志
3、出错处理
- 出错1:栈顶的终结符与当前输入符不匹配。
解决方法:直接将栈顶出栈。
- 出错2:栈顶为非终结符A,输入符为a,而分析表M[A,a]为空。
解决方法:允许自动匹配,进行自动匹配,以推迟检测到错误的时间;或者跳过输入串的一些符号,直到遇到同步符号。
4、预测分析程序的分析过程
- 将‘#’和起始符入栈;输入符号为字符串的第一个字符。
- 查询分析表,决定操作:使用规则替换(产生式右部逆序入栈)、出栈且读入下一个符号、出错、接受。
例题:根据上面的预测分析表,分析 # i+i*i #的分析过程。(#...#,是一个句子的开始符和结束符)。
含有出错处理的分析过程:
七、总结
-------------------------------------------------------END-------------------------------------------------------------------
任意门:
编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)-优快云博客