LR1 Parser和Epsilon

时间:2009-01-28 08:45:10

标签: parsing compiler-theory lr1

我正在试图了解LR1 Parsers的工作方式,但我想出了一个奇怪的问题:如果语法包含Epsilons怎么办?例如:如果我有语法:

S -> A
A -> a A | B
B -> a

很清楚如何开始:

S -> .A
A -> .a A 
A -> .B

......等等

但是我不知道怎么做这样的语法:

S -> A
A -> a A a | \epsilon

这样做是否正确:

S -> .A
A -> .a A a
( A -> .\epsilon )

然后让DFA接受这个状态吗?

真的很感激任何帮助!

2 个答案:

答案 0 :(得分:4)

是的,确切地说(将epsilon视为空白区域,两侧的点没有两个位置)。

在LR(0)自动机中,您将使状态接受并减少到A.但是,由于A->a A a生成,会出现转移/减少冲突。

在LR(1)自动机中,您将使用前瞻(a - > shift,FOLLOW(A) - >减少)中的任何内容确定是移位还是缩小

请参阅Wikipedia article

答案 1 :(得分:0)

您可以使用此站点来计算: https://cyberzhg.github.io/toolbox/lr1

查看结果:

enter image description here