1 LR语法分析器
本节介绍一个有效的自底向上的分析技术,可以用于一大类上下文无关文法的语法分析。这种技术叫做LR(k)分析法,其中L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程,k指的是在决定语法分析动作时需要向前看的符号个数。(k)省略时,假设k是1。LR分析富有吸引力的原因有以下几点:
v LR语法分析器能识别几乎所有能用上下文无关文法描述的程序设计语言的结构。
v LR分析法是已知的最一般的无回溯移动归约语法分析法,而且可以和其它移动归约分析一样被有效地实现。
v LR分析法分析的文法类是预测分析法能分析的文法类的真超集。
v 在自左向右扫描输入符号串时,LR语法分析器能及时发现语法错误。
这种分析方法的主要缺点是,对典型的程序设计语言文法,手工构造LR语法分析器的工作量太大,需要专门的工具。
1.1 LR语法分析算法
规范归约(最左归约-最右推导的逆过程)的关键问题是寻找句柄。在一般的“移进-归约”过程中,当一串貌似句柄的符号串呈现于栈顶时,我们有什么方法可以确定他是否为相对于某一个产生式的句柄呢?LR分析的基本思想是,在规范归约过程中,一方面记住已移进和归约出的整个符号串,即记住“历史”,另一方面根据所用的产生式推测未来可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于分析栈的顶端时,我们希望能够根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶的符号串是否构成相对某一产生式的句柄。
从LR分析方法可以看出,其实现有一定的困难。作为归约过程的“历史”材料的积累虽不困难(实际上,这些材料都存在分析栈中),但是“展望”材料的汇集却是一件很不容易