我正在使用以下语法编写SLR(1)解析器:
1) S -> aSb
2) S -> cB
3) B -> cB
4) B -> ε
首先,我开始寻找相关的LR(0)自动机,增加语法,添加S' -> S
生成并开始计算各种状态。我找到的州是:
I0 = {S' - >•S,S->•aSb,S-> cB}
(I0,S)= I1; (I0,a)= I2; (I0,c)= I3;
I1 = {S' - > S•}
I2 = {S-> a•Sb,S-> aSb,S-> cB}
(I2,S)= I4; (I2,a)= I2; (I2,c)= I3
I3 = {S-> c·B,B-> cB,B->ε}
(I3,B)= I5; (I3,ε)= I6; (I3,c)= I7;
I4 = {S-> aS·b}
(I4,b)= I8;
I5 = {S-> cB•}
I6 = {B->ε•}
I7 = {B-> c•B,B-> cB,B->ε}
(I7,B)= I9; (I7,ε)= I6; (I7,c)= I7;
I8 = {S-> aSb•}
I9 = {B-> cB•}
这里有LR(0)自动机:
之后,我做了解析器表(但我认为不需要它来回答我的问题)所以我有一个疑问: 是以正确的方式处理的epsilon过渡?我的意思是,我将它视为正常角色,因为我们必须在某个时刻减少规则4。如果我错了,我该如何看待这种转变呢?在此先感谢,希望这对其他人也有帮助。
答案 0 :(得分:3)
不,没有必要创建State I6
Y->Ɛ
可能会出现混淆。当您在增强型制作中放置一个点,例如S->A.B
时,意味着A
已完成且B
尚未完成(此处完成意味着解析的进度)。同样,如果您编写Y->.Ɛ
,则表示Ɛ
尚未结束,但我们也知道Ɛ
为null string
,因此Y->.Ɛ
无法解释为Y->.
[[1, "A"], [2, "B"]]
|> Enum.map(fn [key, value] ->
{String.to_atom(to_string(key)), value} end)
答案 1 :(得分:0)
不需要... 甚至我在删除以下语法的左递归时也遇到相同的问题
E->E+T|E-T|T
转换后的规则看起来像
E->T X
X->+TX|-TX|*e*
与
无关紧要x->。 e 和x-> e 。没有意义。因为移动Epsilon前后的时间是疯子的工作