Parsing 确定性上下文无关语法与上下文无关语法?

Parsing 确定性上下文无关语法与上下文无关语法?,parsing,programming-languages,big-o,context-free-grammar,context-free-language,Parsing,Programming Languages,Big O,Context Free Grammar,Context Free Language,我正在读比较语言课的笔记,我有点困惑 上下文无关语法和确定性上下文无关语法之间的区别是什么?我专门阅读了关于CFG的解析器是O(n^3),DCFGs的编译器是O(n),但我并不真正理解时间复杂性的差异是如何如此巨大的(更不用说我仍然对CFG成为DCFG的特征感到困惑) 提前非常感谢 从概念上讲,它们很容易理解。上下文无关语法是那些可以用BNF表示的语法。DCFG是可以为其编写可行解析器的子集 在编写编译器时,我们只对DCFGs感兴趣。原因是“确定性”大致意味着在解析过程中的任何一点应用的下一个规

我正在读比较语言课的笔记,我有点困惑

上下文无关语法和确定性上下文无关语法之间的区别是什么?我专门阅读了关于CFG的解析器是O(n^3),DCFGs的编译器是O(n),但我并不真正理解时间复杂性的差异是如何如此巨大的(更不用说我仍然对CFG成为DCFG的特征感到困惑)


提前非常感谢

从概念上讲,它们很容易理解。上下文无关语法是那些可以用BNF表示的语法。DCFG是可以为其编写可行解析器的子集

在编写编译器时,我们只对DCFGs感兴趣。原因是“确定性”大致意味着在解析过程中的任何一点应用的下一个规则都是由目前为止的输入和有限的前瞻性决定的。Knuth在20世纪60年代发明了LR()编译器,并证明它可以处理任何DCFG。从那时起,一些改进,特别是LALR(1)和LL(1),已经定义了可以在有限内存中解析的语法,以及我们编写它们的技术

如果我们知道BNF是这些语法中的一种,我们也有从BNF自动派生解析器的技术。Yacc、Bison和ANTLR是常见的例子

我从未见过NDCFG的解析器,但在解析中的任何一点,它可能需要考虑整个输入字符串和可能应用的每一个可能的解析。不难看出为什么会变得相当大和缓慢


我应该指出,许多真正的语言是不完美的,因为它们不是完全上下文无关的,不是明确的,或者偏离了理想的DCFG。C/C++是一个很好的例子,但还有很多其他例子。这些语言通常由特殊目的规则处理,如语义或语法谓词、特殊情况回溯或其他“技巧”,对性能没有影响


评论指出,某些类型的NDCFG是常见的,许多工具提供了处理它们的方法。一个常见的问题是歧义。通过引入简单的局部语义规则来解析歧义语法相对容易,但这当然只能生成一个可能的解析树。NDCFG的通用解析器可能会生成所有解析树,并且可能允许在某些任意条件下过滤这些树。这些我都不知道


左递归不是NDCFG的特性。它对LL()解析器的设计提出了特殊的挑战,但对LR()解析器没有问题。

您可以参考,您将找到所有示例和venn图根据您在此处提供的定义,ANTLR 4与NDCFGs一起工作。@280Z28:请参见编辑。与大多数解析器生成器一样,ANTLR可以处理与DCFG的某些有限偏差。ANTLR 4使用具有歧义检测和解析的非回溯无限前瞻预测机制。它可以为任何不包含间接或隐藏左递归(直接左递归)的NDCFG提供有效的解析树。用C++来分析DCFG是一个噩梦,因为实际上很多语法都是模糊的。我们使用GLR直接解析C++。有关详细讨论,请参阅。