第五章 语法分析-自下而上分析

来源:互联网 发布:javascript 数组排序 编辑:程序博客网 时间:2024/05/29 02:09

自底向上分析方法从输入符号串开始,查找当前可归约串,并用产生式将它归约成相应的非终结符号,最后归约为识别符号的一种分析方法。

注意以下几点:

(1)对输入符号串的扫描,采用自左向右的顺序;

(2)分析过程是自下而上进行的(对语法树来说从末端结点开始,最后归约到根结点);

(3)每次归约是对最左可归约串进行的

(4)算法的关键是确定最左可归约串

重点掌握:
(1)
句柄、素短语、最左素短语、算符文法、算符优先文法等概念及判断法;
(2)
优先关系的概念及判断方法。

5.1自底向上分析的一般过程

一、一般过程

       一般的自底向上分析法,也称为“ 移进—归约”法,其一般过程为:

(1)设置一个存放符号的栈称为符号栈,用于记录分析的过程和确定下一步的动作。

(2)把输入符号按扫描顺序逐个移进栈里(符号栈),当栈顶的符号组成的符号串形成一个可归约串时(正好是某条产生式的右部),就进行归约。即把该符号串用与它对应的产生式左部的非终结符号代替,仍然置于栈顶。

(3)接着检查新栈顶,若形成新的可归约串,再进行归约,若没有形成新可归约串,则从符号串中移进新的符号。如此重复,直到整个输入符号串处理完毕为止。

(4)若最终栈底为识别符号,则表明所分析的输入串合法,报告分析成功;否则是不合法的符号串,报告出错信息。

二、举例


总结以上过程可以发现:

并没有彻底解决可归约串的识别问题

在上例中当进行到步骤5后,符号栈和剩余输入符号串的内容为:

5     #aAb    cde#

即输入符号串已经归约为:#aAbcde#,根据上述算法,下一步Abb都可以归约(它们都在符号栈的栈顶且有产生式A®AbA®b)。假若判b为可归约串,则可把b归约为A,即符号串归约为:#aAAcde#。那么,后面的工作无论怎样做,都无法归约成功。



5.2算符优先分析法

一、方法概述

       算符优先分析法是自底向上分析方法中的一种,虽然它不是规范归约,但它具有分析速度快,特别适合表达式分析的特点,因而得到普遍应用。

       在算术表达式的运算过程中,为了确保计算过程和结果的唯一性,规定了四则运算法则,实际上就是规定了运算之间的优先顺序,如:先乘除后加减;同级运算从左向右;有括号先做括号内的运算;一目运算减(负号)的优先级高于加减低于乘除。

       所谓算符优先分析法就是仿照上述算术四则运算的运算过程,而设计的一种语法分析方法。它首先要规定运算符之间的优先关系,然后利用这种关系确定句型的“可归约串”,并进行归约。


二、直观的算符优先分析法

       实际上,在真正的算符优先分析方法中,需定义任意两个相继出现的终结符号ab之间的优先关系(ab之间可有一个非终结符),一旦确定了这种优先关系,就可以用它来确定“可归约串”进行归约。

1.优先关系,两个相继出现的终结符之间的优先关系有三种:



三、算符优先文法







四、算符优先分析算法:

\





5.3算符优先分析法的进一步讨论

一、算符优先函数


5.3  LR分析方法

       LR分析法是一种有效的自底向上的语法分析技术,它能适用于大部分上下文无关文法的分析,一般叫LR(k)分析方法,其中L是指自左(Left)向右扫描输入单词串,R是指分析过程都是构造最右(Right)推导的逆过程(规范归约),括号中的k是指在决定当前分析动作时向前看的符号个数

       LR分析法与其它语法分析方法相比,应用更广泛,具有更强的吸引力,主要原因有:

(1)应用面广:能够通过LR分析程序识别所有采用上下文无关文法描述的程序设计语言的结构;

(2)能有效实现:是最一般的无回溯的移进—归约方法,能够象其它的移进—归约方法一样有效的实现;

(3)容易查错LR分析器能够及时发现语法错误和准确指出错误位置。

LR分析器的逻辑结构























原创粉丝点击