第四章 语法分析–自上而下分析
首先语法分析部分是作为编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。
本质上就是按文法的产生式,识别输入符号串是否为一个句子。
就是建立一棵与输入串相匹配的语法分析树
(语法分析器在编译程序中的地位)
根据语法分析树的建立方法把语法分析分成两类: 自上而下分析法、自下而上分析法
判断
1、从文法的起始符出发进行句子的推导,即**自上而下的分析**
2、从句子本身出发,进行归约,看能否把句子规约为到起始符,即**自下而上的规约**
自上而下的分析方法的基本思想:
对任何一个输入串,试图用一切可能的办法,从文法的开始符号(根节点)出发,根据文法自上而下地为输入串建立一棵语法树,即为输入串寻找一个最左推导。
思想本质:是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。
从下面的例子中可以看出自上而下分析法面临的问题:
首先从上面的例子中得到语法分析器的构造方法是这样的
让每个非终结符号对应一个递归子程序。每个子程序可以作为一个布尔过程(返回“真”或“假”):
(1)一旦发现该非终结符的某个候选式与输入串相匹配,就用这个候选式去扩展语法树,并返回“真”值;
(2)该候选式和输入串不匹配,则保持原来的语法树和IP值不变(IP回溯),并返回“假”值
从而看出其所面临的问题:
1、文法的左递归问题
2、回溯的不确定性,要求我们将已经完成工作推倒从来,
3、虚假匹配的问题
4、不能准确地确定输入串中出错的位置
5、效率低
所以由于带回溯的自上而下的分析实际上采用了一种穷尽一切可能的试探法,因此效率低、代价高、,使这种分析方法只有理论意义,而实践上面的意义不大。
所以我们就需要使得消除文法的左递归性、克服回溯
首先是消除左递归
(一)直接左递归消除
例子:
![这里写图片描述](https://img-blog.csdn.net/20180425200136462?watermark/2/text/aHR0