概述: LR分析法是一种自下而上进行规范归约的语法分析法,L指从左到右扫描输入符号串,R是指构造最右推导的逆过程。对大多数无二义性上下文无关文法描述的语言都可用它进行有效的分析。主要分析器有LR(0),SLR(1),LR(1),LALR(1): LR(0):在分析的每一步,只需根据当前栈顶状态而不必向前查看输入符号就能确定应采取的分析动作。所能分析的LR(0)文法要求文法的每一个LR(0)项目集中都不含冲突项目。 示例文法:
SLR(1):通过采用对含有冲突的项目集向前查看一个输入符号的办法来解决冲突的方法。 示例文法:
一、LR分析器由三个部分组成: (1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。 (2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。 (3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。分析器的动作就是由栈顶状态和当前输入符号所决定。
二、分析算法及思路: ①、数据结构: 二维数组action[][]存放ACTION表中的元素,二维数组goto[][]存放GOTO表中元素。字符数组vt[]存放终结符,字符数组vn[]存放非终结符。字符数组LR[]存放产生式。数组a[]实现状态栈,数组b[]实现符号栈。 ②、算法: 初始化,初始状态S0在分析栈栈顶,输入串W#的第一个符号读入a中。 while( ACTION[S,a] != acc) { if( ACTION[S,a] == Si) {状态i和输入符号a进栈;将下一个输入符号读入a中;} else if (ACTION[S,a] == rj) { 用第j条规则A –> a 归约;将|a|个状态和|a|个输入符号退栈;当前栈顶状态为S’,将A和GOTO[S’,A] = S’’进栈; Else if(ACTION[S,a]==ERROR) error(); } 三、程序源代码(SLR(1)) 对应文法:
分析表:
|