具有无限前瞻性的理论LR解析器是否能够解析(明确的)语言,这些语言可以通过无上下文语法进行描述?
通常,LR(k)解析器仅限于确定性无上下文语言。我认为这意味着总是必须有一个当前可以应用的语法规则。在当前先行上下文中的含义允许发生不超过一种可能的解析方式。 “语言实现模式”一书指出“......解析器是不确定的 - 它无法确定选择哪种替代方案。”如果前瞻设置重叠。相比之下,如果存在多个备选方案,则非确定性解析器只选择一种方式,然后返回到决策点,如果在某一点无法继续执行先前做出的决策,则选择下一个备选方案。
无论我在哪里阅读LR(k)解析器的定义(如维基百科或龙书中),我总是会读到类似:“k是前瞻标记的数量”或“k> 1”时的情况,但从不k可以是无限的。在成功之前,尝试所有替代方案是不是无限前瞻?
为了(隐式地)区分LR(k)解析器和非确定性解析器,可能假设k是有限的吗?
答案 0 :(得分:1)
您在这里提出了一些难以以简短形式回答的问题。不过我会尝试。
首先,什么是“无限前瞻”?没有描述这种解析器的书。如果你清楚这是什么,你需要先描述它。只有在那之后我们才能讨论这个话题。目前解析理论仅讨论LR(k)语法,其中k是有限的。
通常,LR(k)解析器仅限于确定性上下文 语言。我认为这意味着总是必须有一个 当前可以应用的语法规则。
这是错误的。 LR(k)语法可能具有“语法冲突”。龙书简要提到了他们,没有详细说明。 “语法可能有冲突”意味着一些语法没有冲突,而所有其他语法都有冲突。当语法没有冲突时,总是只有一条规则而且情况相对简单。
当语法有冲突时,这意味着在某些情况下可以使用多个规则。经典解析器在这里无法帮助。更糟糕的是,某些输入语句可能有一组正确的解析,而不仅仅是一个。从语法理论的角度来看,所有这些解析都具有相同的价值和重要性。
“语言实现模式”一书指出“...解析器 是不确定的 - 它无法确定哪种替代方案 选择“。
我的印象是,对于“非确定性解析器”的含义没有明确的一致意见。我倾向于说非确定性解析器只是随机选择其中一个替代方案并继续。
实际上只使用了两种解决冲突的策略。第一个是回调处理程序中的冲突解决方案。回调处理程序是常规代码。编写程序员,以他想要的任何方式检查他想要的任何东西。此代码仅返回结果 - 要采取的操作。对于顶部的解析器,此回调处理程序是一个黑盒子。这里没有理论。
第二种方法称为“回溯”。背后的想法非常简单。我们不知道去哪里。好吧,让我们尝试所有可能的选择。在这种情况下,尝试了所有变体。这里没有任何不确定性。有几种不同的回溯方式。
如果这还不够,我可以写一点。
答案 1 :(得分:0)
非确定性意味着为了产生正确的结果(s!),有限状态机读取令牌然后具有N> 1个下一个状态。如果节点具有多个具有相同标签的传出边,则可以识别非确定性FSM。请注意,并非每个分支都必须有效,但FSM不能只选择一个分支。在实践中你可以在这里分叉,产生N个状态机,或者你可以完全尝试分支,然后回来尝试下一个,直到每个传出的状态转移都被测试。