知识总结
一、自上而下分析
1、基本思想
对任何一个输入串试图用一切可能的办法,从文法的开始符号(根节点)出发,根据文法自上而下地为输入串建立一棵语法树,即为输入串寻找一个最左推导。
2、本质:是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。
3、实现方法
让每个非终结符号对应一个递归子程序。每个子程序可以作为一个布尔过程(返回“真”或“假”):
(1)一旦发现它的某个候选与输入串相匹配,就用这个候选式去扩展语法树,并返回“真”值;
(2)否则,保持原来的语法树和IP值不变(IP回溯),并返回“假”值。
4、存在问题
- 文法的左递归性问题
- 回溯的不确定性
- 虚假匹配的问题
- 不能准确地确定输入串中出错的位置
- 穷尽一切可能的试探法,效率低代价高
二、消除左递归
- 对于直接左递归,如产生式P→Pα1|Pα2|…|Pαm|β1|β2|…|βn(其中每个βi不以P开头,每个αi不为ε),改写成:
P→β1P’|β2P’|…|βnP’ P’→α1P’| α2P’|…|αmP’| ε
- 对于间接左递归,按消除算法执行,注意非终结符排列顺序不同,消除递归之后文法的形式也可能不同,但表达能力相同。
消除左递归算法:
(1)把文法G