1

具有无限前瞻的理论 LR 解析器是否能够解析(明确的)可以由上下文无关文法描述的语言?

通常 LR(k) 解析器仅限于确定性上下文无关语言。我认为这意味着必须始终有一个当前可以应用的语法规则。在当前的前瞻上下文中的含义不超过一种可能的解析方式被允许发生。“语言实现模式”一书指出,“......解析器是不确定的 - 它无法确定选择哪个替代方案。” 如果前瞻集重叠。相反,如果有多个备选方案,非确定性解析器只会选择一种方式,然后返回决策点,如果在某个点不可能继续先前做出的决策,则选择下一个备选方案。

无论我在哪里阅读 LR(k) 解析器的定义(例如在 Wikipedia 或 Dragon Book 中),我总是会读到以下内容:“k 是前瞻标记的数量”或“k > 1”的情况,但如果 k 可以是无限的,则永远不会. 无限前瞻与尝试所有替代方案直到成功不一样吗?

为了(隐式)区分 LR(k) 解析器和非确定性解析器,是否假设 k 是有限的?

4

2 回答 2

1

你在这里提出了几个很难用简短的形式回答的问题。不过我会尝试的。

首先,什么是“无限前瞻”?没有描述这种解析器的书。如果你清楚这是什么,你需要先描述一下。只有在那之后,我们才能讨论这个话题。目前,解析理论只讨论 LR(k) 文法,其中 k 是有限的。

通常 LR(k) 解析器仅限于确定性上下文无关语言。我认为这意味着必须始终有一个当前可以应用的语法规则。

这是错误的。LR(k) 语法可能有“语法冲突”。龙书只略略提过,没有详述。“语法可能有冲突”是指某些语法没有冲突,而所有其他语法都有冲突。当语法没有冲突时,总是只有一个规则,情况相对简单。

当语法有冲突时,这意味着在某些情况下不止一个规则适用。经典解析器在这里无能为力。更糟糕的是,某些输入语句可能有一组正确的解析,而不仅仅是一个。从语法理论的角度来看,所有这些解析都具有相同的价值和重要性。

“语言实现模式”一书指出,“......解析器是不确定的 - 它无法确定选择哪个替代方案。”

我的印象是,对于“非确定性解析器”的含义没有明确的协议。我倾向于说,非确定性解析器只是随机选择一种选择并继续。

实际上只使用了两种解决冲突的策略。第一个是回调处理程序中的冲突解决。回调处理程序是常规代码。编写它的程序员以任何他想要的方式检查他想要的任何东西。这段代码只返回结果——采取什么行动。对于顶部的解析器,此回调处理程序是一个黑匣子。这里没有理论。

第二种方法称为“回溯”。背后的想法很简单。我们不知道该去哪里。好的,让我们尝试所有可能的替代方案。在这种情况下,会尝试所有变体。这里没有什么是不确定的。回溯有几种不同的风格。

如果这还不够,我可以再写一点。

于 2012-06-14T23:40:51.613 回答
0

非确定性意味着为了产生正确的结果,有限状态机读取一个令牌,然后有 N>1 个下一个状态。如果一个节点具有多个具有相同标签的出边,则可以识别非确定性 FSM。请注意,并非每个分支都必须有效,但 FSM 不能只选择一个。实际上,您可以在这里分叉,从而产生 N 个状态机,或者您可以完全尝试一个分支,然后返回并尝试下一个,直到每个传出的状态转移都经过测试。

于 2012-08-12T18:35:57.750 回答