Parsing LR1解析器与Epsilon

Parsing LR1解析器与Epsilon,parsing,compiler-theory,lr1,Parsing,Compiler Theory,Lr1,我试图理解LR1解析器是如何工作的,但我遇到了一个奇怪的问题:如果语法包含ε怎么办?例如:如果我有语法: 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 )

我试图理解LR1解析器是如何工作的,但我遇到了一个奇怪的问题:如果语法包含ε怎么办?例如:如果我有语法:

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中接受

任何帮助都将不胜感激

是的,没错(把ε想象成一个空的空间,两边没有两个点)

在LR(0)自动机中,您将使状态接受并简化为A。但是,由于
A->A
生产,将存在移位/简化冲突

在LR(1)自动机中,您将使用前瞻(
a
->shift,
中的任何内容都跟随(a)
->reduce)来确定是移位还是缩减


请参见

您可以使用此网站来计算:

请参见结果:


不可能。仍然不相信我在堆栈溢出上发现了这个问题;)因此,下次应用
Goto
函数时,您是否会执行
Goto(Io,\epsilon)
其中
Io
是第一个状态?您是否说
A->。\epsilon
不在
I0