含ε产生式的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




