SLR(1)解析器与语法中的epsilon转换

时间:2017-01-25 23:07:32

标签: parsing compiler-construction computer-science grammar formal-languages

我正在使用以下语法编写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)自动机:

Automaton Picture

之后,我做了解析器表(但我认为不需要它来回答我的问题)所以我有一个疑问: 是以正确的方式处理的epsilon过渡?我的意思是,我将它视为正常角色,因为我们必须在某个时刻减少规则4。如果我错了,我该如何看待这种转变呢?在此先感谢,希望这对其他人也有帮助。

2 个答案:

答案 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)

您可以使用JFLAP Software并查看documentation about SLR(1)

答案 1 :(得分:0)

不需要... 甚至我在删除以下语法的左递归时也遇到相同的问题

E->E+T|E-T|T 转换后的规则看起来像 E->T X X->+TX|-TX|*e*

无关紧要

x->。 e 和x-> e 。没有意义。因为移动Epsilon前后的时间是疯子的工作