Parsing LR解析如何解析单词“quot;”;a“b”;在本语法中:S->;a b | a T;T->;A.

Parsing LR解析如何解析单词“quot;”;a“b”;在本语法中:S->;a b | a T;T->;A.,parsing,grammar,context-free-grammar,lr,Parsing,Grammar,Context Free Grammar,Lr,假设我有一本语法书 S -> a b | a T T -> a 显然,语法接受{aa,ab}。但我很困惑LR解析如何解析“AB”这个词。天真地说,它可以像这样工作,将第一个“a”减少到T,然后它就会卡住或不得不回溯 a a => T a => stuck or backtrack LR解析器如何知道它不应该将第一个“a”减少到T?在这种情况下,解析器永远不会尝试减少T,因为生产T→ 未处于从S到达的任何状态。初始状态包含以下项: S → • a b S → • a T

假设我有一本语法书

S -> a b | a T
T -> a
显然,语法接受{aa,ab}。但我很困惑LR解析如何解析“AB”这个词。天真地说,它可以像这样工作,将第一个“a”减少到T,然后它就会卡住或不得不回溯

a a => T a => stuck or backtrack

LR解析器如何知道它不应该将第一个“a”减少到T?

在这种情况下,解析器永远不会尝试减少
T
,因为生产
T→ 
未处于从
S
到达的任何状态。初始状态包含以下项:

S → • a b
S → • a T
在这种状态下,唯一可能的操作是带有标记
a
的移位操作。因为
a
实际上是下一个输入字符,所以我们将移位转换到itemset为的状态

S → a • b
S → a • T
T → • a
S → a b •
此状态也没有减少操作,它有两个不同的换档操作:一个在
b
上,另一个在
a
上。由于下一个输入是
b
,因此会执行该移位操作,从而导致项目集为的状态

S → a • b
S → a • T
T → • a
S → a b •
其中只有一个减少是可用的

一个稍微有趣一点的例子是类似的语法

S → a b
S → T a
T → a
这里,初始状态的项集确实包括
T
的生产:

S → • a b
S → • T a
T → • a
在初始状态下,唯一可用的操作仍然是移位
a
,但现在移位后,我们发现自己处于一种状态,其项集为:

S → a • b
T → a •
现在我们有两种可能的行动:移动
b
和减少
T→ a
。在这里,解析器需要使用它的能力来观察一个令牌的未来(假设它是
LR(1)
parser)

但要让它这样做,我们需要做一个小小的调整。语法总是在构造解析自动机之前进行“扩充”。增广语法通过添加一个唯一的输入结束字符来增加对输入结束的显式识别,该字符还可以参与前瞻检查。扩充语法是:

S'→ S $
S → a b
S → T a
T → a
在这个语法中,我们可以看到非终结符
T
后面只能跟符号
a
,并且这个事实被编码到状态转换表中,其中itemset中的每个项实际上都被一组可能的lookahead注释。(在表格构建过程中,所有项目都进行了注释,但对于法律诉讼的计算,仅考虑减少的外观;减少是指其•位于末尾的项目。)

通过此修改,移位
a
后到达的项集为:

S → a • b
T → a •    [ lookahead: { a } ]
而前瞻性则明确指出了应该选择哪种行动。如果下一个输入是
b
,则它会移位。如果下一个输入是
a
T


该精度在LR(0)解析中不可用,在LR(0)解析中不使用前瞻。修改后的语法不是LR(0),正是因为您提到的原因:它无法决定是否减少
T
。这个问题经常出现,这就是为什么LR(0)在实践中很少有用的原因。

给出了“ab”的示例输入。。。读取“a”后,解析器处于包含以下项的状态:

    S -> a . b
    S -> a . T
    T -> . a

由于这些项目在生产结束时都没有dot,因此州政府不要求采取任何减少行动。唯一可用的操作是移位,以便解析器读取下一个符号。无需提前查看。

谢谢!问:你是如何得到“生产T”的→ 仅当前瞻为$“?”时,才能有效地应用a?我可以从S->a T中看出这种直觉。但是系统化的方法是什么呢?@zell:你没有看一个例子吗?正是由于这个原因,用于生成LR oarser操作表的算法会跟踪前瞻。您可以简单地使用每个非端子的FOLLOW集合,但这不够精确。(这产生了一个SLR解析器,但它在许多语法上都失败了。)在我看来,这个语法看起来是LR(0)。@MichaelDyck:在这种情况下是这样的,这对答案有一定的影响。我会努力的。谢谢。@zell:MichaelDyck在评论中指出,我对这个简单语法的分析实际上并不正确。解析器没有尝试减少
T
的原因是不同的。我修正了答案,并添加了一个稍微不同的示例,我最初的分析是正确的。很抱歉搞混了。