合并LR状态以形成LALR语法分析的集合

时间:2014-04-09 14:32:32

标签: context-free-grammar lalr

如果我认为我有以下状态:

I1: S->TaV.,$

T -> V.,a

I2: T -> V.,a|$

我会合并这些状态吗?

基本上,我想知道I1的核心是什么。是{ S-> TaV 。 , T-> V。} I1的核心,或者我会说I1包含两个核心 - S-> TaV &的 T->·V

Dragonbook说,对于LR(1)项目中的每个核心,找到具有该核心的所有集合,并用它们的联合替换它。

现在,如果{ S-> TaV 。 , T-> V。}是I1的核心,然后我不会合并这些集合。 但是,对于核心 T-> V。,I1和I2都包含核心,因此必须用它们的联合替换。

那么我应该合并这些集合吗?

可能有用的一些背景细节:

开始的原始语法是

G: S->TaV | T

T->V | b

V->Ta | c

1 个答案:

答案 0 :(得分:1)

LALR(1)解析器生成器不会完全合并状态。它检查是否已创建新创建的状态。它通过比较核心项目将新状态与所有其他状态进行比较。如果核心项是相同的(相同数量的项目和相同的项目),则丢弃新创建的状态,并且转换应该转到旧状态。

LALR(1)解析器生成器构建LR(0)状态机,并且在状态构建过程中不关心预测。所有它关心的是项目集。所以答案是否定的,这两个状态不应该合并,因为I1有2个核心项目,I2有1个核心项目。

合并状态的想法适用于最小LR(1)状态构造,这是一个比LR(0)状态构造更复杂的过程。

这是一个LALR语法分析问题,而不是语法分析。