目录
一、自顶向下的语法分析概述
每个推导需做两个选择:
1.替换当前中的那个终结符 ?
2.用该非终结符中的那个推导式去替换 ?
最左推导
总选择每个句型最左非终结符进行替换
最右推导
总选择每个句型最右非终结符进行替换。
最左推导和最右推导都是唯一的。
自顶向下的语法分析采用最左推导方式
1.总是在句型的最左非终结符替换。
2.根据输入流中的下一个终结符,选择最左非终结符的一个候选方式。
例如:
自顶向下的语法分析的通用形式(分析过程
递归下降分析
1、由一种过程组成,每个过程对应一个非终结符。
2、从文法符号S对应的过程开始,其中会递归调用文法中其他非终结符对应的过程。如果S对应的过程中恰好扫描了整个输入串。则成功完成语法分析。
回溯
存在多个同一非终结符的候选式时,不确定选择哪个,就要挨个尝试,就可能会失败,要回溯重新尝试。
回溯会影响分析效率
预测分析
预测分析是递归下降分析技术的特例。通过在输入中向前看固定个数(通常是1)符号来选择正确的A的产生式。
可以对某些文法构造出向前看k个输入符号的预测分析器,改文法也称 LL(k)文法类
预测分析不需要回溯,是一种确定的自顶向下分析方法
二、文法转换
同一非终结符的多个候选式存在共同的前缀时,导致回溯的出现。
左递归现象:直接/间接左递归. 会使递归下降分析器陷入无限循环。
消除左递归
实际上是把左递归转换成了右递归。
会引入新的非终结符和产生式。
消除间接左递归
带入的方式:将第一个产生式带入第二个产生式中的。
消除左递归的算法
提取左公因子
提取左边公共的前缀。
三、LL1文法(预测分析法)
S_文法 :(简单的确定性文法)
预测分析法的工作过程
从文法开始符号出发,每一步推导过程根据当前句型的最左非终结符A和当前输入符号a。选择正确的A-的产生式。保证分析的确定性,选出的候选式必须是唯一的。
S_文法 :
每个产生式都以终结符开始
同一非终结符的各候选式中的首终结符都不同
非终结符的后继符号集
非终结符A的后继符号集
可能在句型中紧跟在A后的终结符a的集合。记作FOLLOW(A),
FOLLOW(A) = {a | S => *aAaB …}
如果A是某句型的最右符号,则将符号“$”,添加到FOLLOW(A)中。eg : FOLLOW(B) = {a,c}。B后跟的是C