LR语法分析-简单的LR技术

来源:互联网 发布:淘宝重复铺货 编辑:程序博客网 时间:2024/06/06 08:53

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

}

LR0)自动机的用法:

假设某个文法的符号串r使得LR(0)运行到某个状态j, 下一个输入符号为a并且有一个a上的转换,那么就移入a,否则就选择规约动作。

LR语法分析算法

组成:一个输入,一个输出,一个栈,一个驱动程序和一个语法分析表(ACTIONGOTO)

当一个移入、规约语法分析器移入一个符号时,LR语法分析器移入的是一个对应的状态,每个状态都是对应栈中该状态之下的内容所包含的信息摘要。

例如 在ID * ID 规约的第一步中

语法分析器移入ID, GOTO(0, ID)=>{5} 对应的状态5

5是当前对应的状态,它表明了F->ID.的信息。

除了开始状态0以外,每一个状态都和唯一的文法符号想关联(反之不成立)

LR语法分析表的结构。

ACTION 和 GOTO 

ACTION(状态I, 终结符号a)

表示在某个状态下,接受下个输入符号所要采取的动作。

取值:

移入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)的不同仅在于分析表ACTIONGOTO

算法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的有效项集合.

原创粉丝点击