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