LR(0)项目集规范族的构造及LR(0)分析表的构造

本文介绍通过闭包函数和转换函数构造LR(0)项目集规范族的方法,并利用这些概念建立状态间的连接关系,最终形成识别活前缀的确定有限自动机(DFA)。此外,还详细说明了如何根据这些原理构建LR(0)分析表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求出文法的所有项目,按一定规则构造识别活前缀 NFA, 再确定化为 DFA 确定化的 工作量较大 ,而且 容易出错 实际应用中并不使用 ,这 里介绍的目的仅仅是为了 便于理解。具体见 识别活前缀的有限自动机构建方法_用编程写诗的博客-CSDN博客
因此这里为了减轻工作量介绍一种实用的方法:
通过 闭包函数 转换函数 直接求出 LR(0) 项目集规范族,再由转换函数建立 状态之间的连接关系得到识别活前缀的 DFA。
闭包函数:构造项目集 I Closure(I)
I 的任何项目都属于 Closure I
A→α .Bβ 属于 Closure I),则对 任何 关于 B 的规则 B→γ , 项目 B→·γ 也属于 Closure I
重复执行上述两步骤,直到 Closure I )不再增大为止
例:
状态转换函数 GO(I,X)
假定 I 是拓广文法 G′的任一项目集,X 为一 文法符号 ,状态 转换函数 GO(I,X) 的定义如下:
GO(I,X) = Closure(J)
其中,J={ A→αX.β│A→α.Xβ∈ I }
新状态的初始项目即圆点移动后的项目称为核。 即 J 称为
识别文法所有活前缀的DFA
使用 GO 函数可以将拓广文法 G′的 LR(0)项目集规范族联结 成一个识别文法活前缀的DFA。具体步骤如下:
a) 置项目
S′→ ·S 为初态集的 核心 项目,然后对其求闭包, CLOSURE({S′→·S} 得到 初态的项目集
b) 对初态集或其它所构造的项目集应用转换函数 GO(I X)= Closure J
c) 重复 b) 直到不出现新的项目为止
d) 状态转换函数 GO(I X) 建立项目集之间的关系
例子:

 LR(0)分析表的构造

LR(0) 项目集规范族为 C={I 0 ,I 1 ,…,I n } S’→. S 称为初态
(1) A→ α·aβ I k GO( I k ,a)= I j ,
若a V T Action [k,x]=S j ( 表示移进 )
若a V N Goto [k,x]=j ( 表示归约 )
(2) A→ α· I k , a ∈V T ( 包括 #) ACTION[ k,a ]= rj (假定产生式 A→ α 是文法 G’ 的第 j 个产生式)
(3) S’箭头 I k , ACTION[ k,# ]= acc
(4) GO(I k ,A)=I j , GOTO[k,A]=j
(5) 分析表中凡是不能用以上规则填入信息的空白格均置 上“报错标志”
根据这个构造方法我们可以得到上面文法的LR(0)分析表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用编程写诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值