自底向上优先分析法
自底向上规约是自顶向下推导的逆过程。自左向右扫描源程序,使用栈结构对扫描的字符进行保存,当栈中出现句型的句柄时就可以进行规约。重复该过程直到规约至开始符号。
最右推导称为规范推导,最左规约称为规范规约,这两个过程互为逆过程。
规约时是按照当前句型的句柄进行规约。所谓句柄是右句型(规范推导获取的句型)的直接短语。自底向上分析的关键问题是如何确定句柄。
5.1 自底线上优先分析概述
自底向上的优先分析分为简单优先分析和算符优先分析方法两种。简单分析是计算所有符号之间的优先关系,包括啊终结符和非终结符,算法优先分析之计算终结符之间的优先关系。按照这种优先关系确定句柄,简单优先规约是一种规范规约,算法优先规约不是规范规约。
5.2 简单优先分析
简单优先分析首先需要获取各个符号之间的优先级。该优先级的意思是在规约时优先级大的符号会比优先级小的符号先进行规约。有了各个符号的优先级之后,扫描符号入栈,当当前栈顶元素大于下一个输入符号的优先级时,说明挡墙符号为句柄的尾符号,在栈中寻找句柄的首符号进行规约,重复过程直到规约至开始符号。
5.3 算法优先分析
直观算符优先分析是人工定义各个非终结符之间的优先关系。值得注意的是,算符之间的优先关系不满足对称性,即A>B不能推导出B<A。
算符文法是产生式中不存在右端是两个非终结符直接相邻的产生式的文法。算符文法中终结符之间的优先关系可以根据产生式进行推导。算符优先文法是算符文法中任意两个终结符之间至多只有三种优先关系的一种成立。
在构造算符优先关系表时需要定义两个集合:最左终结符符号集合和最右终结符符号集合。 通过这两个集合个一定的规则,可计算算符之间的优先关系。
在算法优先法分析 过程中,存在如何寻找句柄的问题,需要使用最左素短语的概念:算符分析的关键是寻找当前句型中的最左素短语。
算符优先算法存在局限性,无法完全避免把错误的句子进行正确得规约,以及文法无法满足算符优先文法定义时无法使用。