我正在试图了解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接受这个状态吗?
真的很感激任何帮助!
答案 0 :(得分:4)
是的,确切地说(将epsilon视为空白区域,两侧的点没有两个位置)。
在LR(0)自动机中,您将使状态接受并减少到A.但是,由于A->a A a
生成,会出现转移/减少冲突。
在LR(1)自动机中,您将使用前瞻(a
- > shift,FOLLOW(A)
- >减少)中的任何内容确定是移位还是缩小
答案 1 :(得分:0)