递归下降分析
- 类似于递归函数:
遍历输入序列:
每遇到终结符VT判断是否匹配成功,
每遇到非终结符VN调用对应的"过程",递归分析
非递归的预测分析
不需要为每个非终结符VN编写递归下降分析的过程,而是根据预测分析表构造一个自动机PDA(表驱动的预测分析)
- 下推自动机(Push Down Automata)
相比有穷自动机,增加一个栈(下推存储器),起到记忆的作用
-> 比有穷自动机识别能力更强: 有穷自动机的状态个数是有穷的,且无法记忆输入符号的个数,所以无法识别无穷的串(比如:任意个a开头的字符串 L = anbn, n >= 1),而下推自动机通过栈可以解决输入符号个数是变量的问题
输出的产生式序列 -> 对应一个最左推导
预测分析法的实现步骤:
预测分析的错误检测与处理:
错误检测:
- 栈顶为 终结符VT 与 输入 不匹配
- 栈顶为 非终结符VN 与 输入 在预测分析表中对应项为空 (table[VN][input] = NULL)
错误处理:
- 恐慌模式:忽略输入符号,直到遇到合法的同步词法单元(Synchronizing token)
- 同步词法单元集的选取可决定恢复的快慢:
为了加速恢复,对于非终结符VN,选择FOLLOW(A)中的终结符作为A的同步词法单元集
这样:
- 如果栈顶是终结符a,匹配失败,将a弹出栈顶
- 如果栈顶是非终结符A而当前输入符号属于同步词法单元集(FOLLOW(A)), 则将A弹出栈顶