You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

含ε产生式的LR(1)分析器项目集构造问题咨询

关于含ε产生式的LR(1)分析器项目集族的问题解答

第一个问题:FIRST(U$)的展望符计算

咱们先明确FIRST集合的计算规则:对于串XY的FIRST集合,如果X能推导出ε,那么FIRST(XY) = FIRST(X) ∪ FIRST(Y);如果X不能推导出ε,就只取FIRST(X)

回到你的问题,已知FIRST(U) = {'b', ε},计算FIRST(U$)时:

  • 当U推导出b时,b直接属于FIRST(U$)
  • 当U推导出ε时,需要看后面的符号$,所以$也属于FIRST(U$)

最终FIRST(U$) = {'b', '$'},你判断的展望符确实是$'b',State2里第二个项目的展望符就是这两个,也就是$/b

第二个问题:ε转移与归约的判定

关于ε转移的问题

首先要明确:LR(1)项目集之间的转移是针对文法中的实际符号(终结符和非终结符)的,ε是空串,不属于文法符号,所以不存在“经eps转移得到项目集”的操作。

你给出的状态:

S -> a S .U, $ 
U -> .b, $ 
U -> .eps, $

其中U -> .eps, $是通过闭包计算得到的(因为有S -> a S .U, $,所以把U的所有产生式加入闭包,包括ε产生式,展望符继承自原项目的展望符$),这个项目已经在当前状态的闭包里,不需要额外做ε转移。

关于归约的触发条件

当项目集中出现U -> eps., $时,是否执行归约,要看当前输入的符号是否等于该项目的展望符

  • 如果当前输入符号是$,就触发归约,把栈顶对应位置(因是ε产生式,无需弹出栈元素)替换成U;
  • 如果是X -> eps., a/$这种项目,当当前输入符号是a或者$时,就触发归约X→ε

第三个问题:分析表中是否需要加入eps符号

完全不需要。LR分析表的列分为两类:一类是终结符(包括结束符$),另一类是非终结符。ε是空串,不是文法定义的符号,所以分析表中不会有eps对应的列。归约ε产生式的动作,是通过判断当前输入符号是否匹配展望符来触发的,不需要单独为eps设列。

内容的提问来源于stack exchange,提问作者Astinog

火山引擎 最新活动