我试图理解LR1解析器是如何工作的,但我遇到了一个奇怪的问题:如果语法中包含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中被接受?
任何帮助都将不胜感激!
发布于 2009-01-28 12:44:15
是的,完全正确(将epsilon想象为空白空间,其中没有两个位置来放置边上的点)。
在LR(0)自动机中,您将使状态为accepting并还原为A。然而,由于A->a A a的产生,将存在shift/reduce冲突。
在LR(1)自动机中,您将使用lookahead确定是移位还是还原(a -> shift,FOLLOW(A) -> reduce中的任何内容)
请参阅Wikipedia article
发布于 2021-02-04 20:28:37
https://stackoverflow.com/questions/486920
复制相似问题