第四章 语法分析
递归的预测分析
- 递归的预测分析法是指:在 递归下降分析 中,编写每一个非终结符对应的过程时,根据预测分析表进行产生式的选择
非递归的预测分析法
- 非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机(下推自动机),也叫表驱动的预测分析过程
- 下推自动机 利用 栈结构 进行记录
表驱动的预测分析法
递归的预测分析法vs.非递归的预测分析法
总结预测分析法实现步骤
- 1)构造文法
- 2)改造文法:消除二义性,消除左递归,消除回溯
- 3)求每个变量的集和集,从而求得每个候选式的集
- 4)检查是否是LL(1)文法。若是,构造预测分析表
- 5)对于递归的预测分析,根据预测分析表为每一个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算法
预测分析中的错误处理
- 两种情况下可以检测到错误
- 栈顶的终结符和当前输入符号不匹配
- 栈顶的非终结符与当前输入符号在预测分析表对应项中的信息为空
预测分析中的错误恢复
- 恐慌模式
- 忽略输入中的一些符号,直到输入中出现由设计者选定的同步词法单元(synchronizing token)集合中的某个词法单元
- 其效果依赖于同步集合的选取。集合的选取应该使得语法分析器能从实际遇到的错误中快速恢复
- 例如可以把中的所有非终结符放到非终结符的同步记号集合中
- 其效果依赖于同步集合的选取。集合的选取应该使得语法分析器能从实际遇到的错误中快速恢复
- 如果终结符在栈顶而不能匹配,一个简单的办法就是弹出此终结符
- 忽略输入中的一些符号,直到输入中出现由设计者选定的同步词法单元(synchronizing token)集合中的某个词法单元
- 例子:
- 分析表的使用方法
- 如果是空,表示检测到错误,根据恐慌模式,忽略输入符号a
- 如果是synch,则弹出栈顶的非终结符A,试图继续分析后面的语法成分
- 如果栈顶的终结符和输入符号不匹配,弹出栈顶的终结符
- 分析表的使用方法
自底向上的语法分析
- 从语法树的 底部(叶节点)向顶部(根节点)方向构造分析树
- 可以看成是将输入串的w归约为文法开始符号的S的过程
- 自底向上的语法分析采用最左推导。
- 自底向上的语法分析采用最左归约方式(反向构造最右推导 )
- 自底向上语法分析的通用框架
- 移入-归约分析(Shift-Reduce Parsing)
- 要点:
- 每次归约的符号串称为“句柄”,也是句型的最左短语
- 栈内符号串 + 剩余输入 = “规范句型”
- 工作过:
- 在对输入串的一次从左至右扫描过程中,语法分析器将零个或多个输入符号移入到栈的顶端,直到它可以对栈顶的一个文法符号串进行归约为止
- 然后,它将归约为某个产生式的左部
- 语法分析器不断重复这个循环,直到它检测到一个语法错误,或者栈中包含了开始符号的且输入缓冲区为空(当进入这样的格局时,语法分析器停止运行并宣称成功完成了语法分析)为止
- 移入-归约分析器可采取的4种动作:
- 移入:将下一个输入符号移到栈的顶端
- 归约:被归约的符号串的右端必然处于栈顶。语法分析器在栈中确定这个串的左端,并决定用哪个非终结符号来替换这个串
- 接收:宣布语法分析过程成功完成
- 报错:发现一个语法错误,并调用错误恢复子例程
- 关键问题:
- 例子的失败情况(造成错误的原因:错误地识别了句柄)
- 例子的成功情况
- 要点:
- 移入-归约分析(Shift-Reduce Parsing)