编译原理:第七节

来源:互联网 发布:spss的数据录入 编辑:程序博客网 时间:2024/04/30 22:10

语法分析

语法分析的概念:


语法分析是编译程序的核心部分,完成词法分析后就进入该阶段。语法分析的主要任务是:按照语言的词法规则,对单词串形式的源程序进行语法检查,并识别出相应的语法成分采用语法树的形式输出,如果不符合语法要求则给出出错的原因。(词法的产生式中的终结符号是单个符号,而语法的产生式的终结符号是单词符号)

语法分析方法:


语法分析方法按语法分析途径,即生成分析树的方向,分为两类:

1. 自上而下分析方法:从文法的开始符号出发,反复使用合适的产生式对句型中非终结符替换,寻找匹配于输入符号串的最左推导。若存在,则输入符号串在语法上是合法的,否则不合法。
2. 自下而上分析方法:从输入符号串开始,逐步进行归约,直至归约到文法(语法)的开始符号。(最右推导的逆过程称为规范归约)

例:S——>aAS|a   A ——>SbA | SS | ba
自上而下分析aabbaa


而自下而上的话反过来从底开始归约。

对于自上而下分析,我们依次尝试匹配,如果当前字符匹配则继续匹配下一个,否则回溯。很明显,这种带回溯的试探法识别的过程很容易使用递归
程序来实现其算法。

不确定性的原因

带回溯的自上而下分析法的效率低,开销大,甚至会导致算法实现的失败。其原因是分析过程中的选择候选式的不确定性。举个例子好理解一些:

例:已知G:S —> Sa | Sb | a   输入串: abb

按照自上而下分析法,则对非终结符S的最左推导会使分析树无休止的延伸。每次选择S的候选式匹配时,又回到它本身,循环无休止的执行下去,
即陷入了死循环。左递归文法都会导致此种情况,所以自上而下分析不能处理左递归文法。(左递归包括直接左递归和间接左递归)

消除直接左递归




消除间接左递归

对于间接左递归,使用代入法来解决,举个例子来看:






1 0