我对如何使用 LR(1) 解析这个语法感到困惑:
S -> A
A -> A(A) | empty
我知道存在左递归,但有人告诉我没有必要为 LR(1) 删除它。我的项目集如下所示:(逗号将语法与前瞻分开)
item set 0:
s -> .A, $
A -> .A(A), $(
A -> ., $(
item set 1:
S -> A., $
A -> A.(A), $(
现在这是我感到困惑的地方:
item set 2:
A -> A(.A), $(
A -> .A(A), )(
A -> ., )(
item set 3:
A -> A(A.), $(
A -> A. (A), )(
item set 4:
A -> A(A)., $(
我被告知要解析字符串“(())”。当我这样做时,我意识到状态 4 需要有一个右括号“)”作为前瞻,这是有道理的。现在我追溯了这一点,发现这个右括号最初应该来自项目集 2 中的第一个语句。
A -> A(.A), $()
这将导致右括号被转移到接下来的 2 个状态,并且我的语法将完美解析。但是,我感到困惑的是,为什么这里应该有一个右括号?$( 不应该从项目集 1 结转。这个右括号是从哪里来的?有人可以解释一下。谢谢