我无法使用包含 epsilon 产生式的语法为 LR(1) 解析器构建项目集的集合。例如,给定以下语法(其中 eps 代表 epsilon)
S -> a S U
U -> b
| eps
State0 将是
S' -> .S, $
S -> .a S U, $
从 State0 用 'a' 移动会得到以下状态,我们称之为 State2
S -> a .S U, $
S -> .a S U, $/???
为了预测 State2 的第二项,我需要计算 FIRST(U$)。我知道 FIRST(U) = {'b', eps}。我的第一个问题是:State2 的第二项的前瞻是 $ 和 'b'?由于 U 可以是 eps,我的大脑告诉我,我也可以将 $ 作为前瞻,而不仅仅是“b”。如果 FIRST(U) 只是 {'b'},它就只是 'b'。那是对的吗?
第二个问题:在某些时候,我将有如下状态
S -> a S .U, $
U -> .b, $
U -> .eps, $
我在这里做什么?我是否需要与 eps 一起移动并与该项目一起设置U -> eps., $
?如果我有另一个终端作为前瞻,即X -> .eps, a/$
?如果我搬家,最终有一套表格X -> eps., $
,我会减少吗?
还有更多:我需要在解析表中插入 eps 作为符号吗?
谢谢