LR(0)分析就是LR(K)分析当K=0的情况,亦即在分析的每一步,只要根据当前的栈顶状态 (或者说根据当前分析栈中已移进或归约出的全部文法符号)就能确定应采取何种分析动作,而无须向前查看输入符号。
LR(0)分析器的分析能力最低,但它是构造其余三种LR分析器的基础。SLR是“简单LR”分析的缩写,它是为了解决构造LR(0)分析器所出现的问题而形成的一种方法,其分析能力自然要比LR(0)分析器稍强一些。
扩展资料:
1965年,D.Knuth首先提出了LR(K)文法及LR(K)分析技术。所谓LR(K)分析,是指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看K个输入符号,就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作。
LR分析是当前最一般的分析方法。这是因为它对文法的限制最少,现今能用上下文无关文法描述的程序设计语言一般均可用LR方法进行有效的分析,而且在分析的效率上也不比诸如不带回溯的自顶向下分析、一般的“移进归约”以及算符优先等分析方法逊色。
此外,LR分析器在工作过程中,还能准确及时地发现输入符号串的语法错误。凡此种种,就使LR分析方法在国际上受到了广泛的重视。
参考资料来源:百度百科-LR分析法
语法分析有自上而下和自下而上两种分析方法其中自上而下:递归下降,LL(1)自下而上:LR(0),SLR(1),LR(1),LALR(1)LR需要构造一张LR分析表,此表用于当面临输入字符时,将它移进,规约(即自下而上分析思想),接受还是出错。
LR(0)找出句柄前缀,构造分析表,然后根据输入符号进行规约。 SLR(1)使用LR(0)时若有冲突,不知道规约,移进,活移进哪一个,所以需要向前搜索,则只把有问题的地方向前搜索一次。 LR(1)1.在每个项目中增加搜索符。2.举个列子如有A->α.Bβ,则还需将B的规则也加入。 LALR(1)就是假如两个产生式集相同则将它们合并为一个,几合并同心集。
先举个例子:
它的规范LR(0)项目集族为:
下面是算法:
初始时,I0=,由规则2:
便可得到上面的I0。
下面是怎么求I2、I3……
先介绍goto函数:
所谓闭包,就是指closure(I)函数。
我们来分析I1是怎么来的,根据goto函数,选取X=E,
由goto函数的定义,
在I0中,goto(I0,E)=
{
}
将其命名为I1。
其他可类似推出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)