LR语法分析-简单的LR技术
LR语法分析是由表格驱动的。
项和LR(0)自动机
项:用来表示在语法分析过程中是进行移入还是进行规约的状态。
一个文法产生式的项是它的产生式加上产生体中的一个。
如:
A -> XYZ的项:
A -> .XYZ
A -> X.YZ
A -> XY.Z
A -> XYZ.
项集表示了在语法分析过程的给定点上,我们已经看到了产生式中的哪个部分。
项集的闭包
如果I是文法G的一个项集,那么CLOSURE(I)的计算如下:
1. 首先将I的各个项加入到CLOSURE(I)中
2. 如果A->α.Bβ 在CLOSURE(I)中并且B->γ是产生式并且B->.γ不在CLOSURE(I)中,将加入,重复这个操作直到没有新项加入到这个集合中。
项集闭包的计算和根据E'->E推导出I0的过程
注意点:如果在最左端的某个B产生式被加入了I的闭包,那么所有B的产生式都会被加入到这个闭包。因此某些情况下不需要真的将那些被CLOSURE函数加入到I中的B->.γ,只需要列出左部的非终结符号。
内核项:包括S'->.S外所有点不在最左端的项。
非内核项:除了S'->.S外所有点在最左端的项。
GOTO 函数
GOTO(I, X) I表示一个项集, X是一个文法符号。
定义:所有形如[A->α.Xβ]的项所对应的[A->αX.β]集合的闭包。
增广文法G'和规范LR(0)项集族算法。
Void items(G')
{
C = CLOSURE([S'->S])
Repate
For (C中的每个项集I)
{
For (每个文法符号X)
{
If (GOTO(I, X) 非空并且不在C中)
{
将GOTO(I, X)加入C
}
}
}
Until 某一轮没有新项加入集合C中
}
LR(0)自动机的用法:
假设某个文法的符号串r使得LR(0)运行到某个状态j, 下一个输入符号为a并且有一个a上的转换,那么就移入a,否则就选择规约动作。
LR语法分析算法
组成:一个输入,一个输出,一个栈,一个驱动程序和一个语法分析表(ACTION和GOTO)
当一个移入、规约语法分析器移入一个符号时,LR语法分析器移入的是一个对应的状态,每个状态都是对应栈中该状态之下的内容所包含的信息摘要。
例如 在ID * ID 规约的第一步中
语法分析器移入ID, GOTO(0, ID)=>{5} 对应的状态5
则5是当前对应的状态,它表明了F->ID.的信息。
除了开始状态0以外,每一个状态都和唯一的文法符号想关联(反之不成立)
LR语法分析表的结构。
ACTION 和 GOTO
ACTION(状态I, 终结符号a)
表示在某个状态下,接受下个输入符号所要采取的动作。
取值:
移入j, 其中 j 是一个状态,语法分析器采用动作是将a移入栈,但使用j表示。
规约A->B 把栈顶β规约长产生式头A
接受 完成语法分析过程
报错 发现错误并修正动作。
GOTO(Ij, A) 表示状态集Ij经由A能到达的目标状态集。
LR语法分析器的格局。
语法分析器的完整状态:栈、余下的输入
格局形如:
(S0,S1 ... Sm, ai ai+1...an$)
表示了如下最右句型:
X1X2...XMaiai+1...am
LR语法分析器的行为:
在根据上面格局决定下一个动作时,首先读入当前输入符号ai 和 栈顶状态 Sm,然后在分析表中查询条目ACTION(Sm, ai) 根据ACTION指定的动作,进行规约或者移入。
如果规约A->B 则进入格局
(S0S1Sm-rS aiai+1...am), 其中m-r代表了B产生式的长度。
在一次规约动作中,当前的输入符号不会被改变。
两个语法分析器(LR)的不同仅在于分析表ACTION和GOTO。
算法4.44 LR语法分析算法
构造SLR语法分析表
方法:
构造G'的LR(0)项集族 C=|I0,I1...In|
根据Ii得到状态i, i的语法分析动作按照下面的方法决定
如果[A->α.aβ]在Ii中并且GOTO(Ii, a) = Ij 那么将ACTION[i, a]设置为移入j, 其中a必须是终结符号。
如果A->α.在Ii中, 那么FOLLOW(A)中的所有a,将ACTION(i, a)设置为规约A->α。这里A不等于S'
如果S'->S 那么将ACTION[i,$]设置为接受
FOLLOW 在某些句型中,可能紧跟在A后面的终结符号的集合
可行前缀
可以在一个移入,规约语法分析器栈中的最右句型称为可行前缀
定义:一个可行前缀是一个最右句型的前缀,并且没有越过该最右句型最右句柄的右端.
表示方式: 则说明A->对于可行性前缀有效。一般来说,一个项可以对多个可行性前缀有效。
可行性前缀的作用:
例如:当发现在栈中时,可以决定是将进行移入操作。
当多个有效项要求对同一个可行性前缀做不同事情,则产生冲突。有些可以通过查看下一个输入符号解决,但也有些无法解决。
计算出可行性前缀有效项的集合:
LR(0)分析理论核心定理:如果我们在某个文法的LR(0)自动机中从初始状态沿着某个可行前缀r的路径到达一个状态,那么该状态的项集就是r的有效项集合.