您永远不需要CNF。它具有改变语法结构的缺点。但是您确实需要引入中间非终结符,以使右侧不超过2(2形式),因为RHS的长度决定了复杂度。直观地解释这一点的最佳尝试是,如果有记忆的话,Beau Shiel于1976年在计算语言学会议上发表的论文“上下文自由解析观察”。Earley的算法隐式使用2形式。它只是隐藏在算法中。关于解析森林的恢复和处理,您应该在网络上查看“解析交叉森林”。实际上非常简单。如果您(从引文或目录中)获得标题或作者以直接进行搜索,则网络上有许多论文。
实际上,您可以做的比CF还要多,并且仍然可以在多项式时间内获得解析森林。有时,问题是:一旦拥有它该怎么办?
您提到的上一篇文章的目的是表明,复杂的算法(例如GLR)不一定会在时间或空间上购买任何东西,并且可能会改变您的解析森林。
关于教学的一句话。我认为,Earley虽然开创性的,但对于教学来说太复杂了,可以用基本具有相同教育内容的简单算法代替。教学涉及概念或技术。在Earley的算法中,基本概念隐藏在细节的复杂性中,并且从技术角度来看已经过时了。这是一篇很棒的论文,但这并不意味着它是最好的教学方法。
计算语言学文献中的信息可能比通常的计算机科学渠道中的信息更多。我没有Ceriel-Grune-Jacobs的书,但是如果他们没有所有正确的参考文献,我会感到惊讶(尽管我不确定他们的选择标准)。
根据评论中的要求进行补充(2013年7月7日)
这种补充使得存在比Earley算法更简单的算法。
就像我说的那样,在“解析交叉林”处搜索网络应该很快为您提供参考,您可以从中进行进一步的挖掘。
基本思想是,所有解析共享森林的路径都不过是Bar Hillel,Perles和Shamir的旧交集结构,即使用有限自动机和上下文无关语法的常规语言和上下文无关语言。给定CF语法,您可以将构造应用于仅识别输入字符串的简单自动机。就这些。共享林只是交集的语法。它通过同态与原始语法相关,仅识别给定的字符串,但具有直到该同态的原始语法的所有解析树(即,简单地重命名非终结点)。
生成的语法包含许多无用的东西,非终结符和规则,它们要么从公理无法到达(无法在从初始符号派生的字符串中找到),要么是非生产性的(无法推导到终结符中)串)。
然后,要么必须最后用一个好的刷子清洁它(可能很长,但是算法上很简单),要么可以尝试改进结构,以使最后要刷掉的无用绒毛更少。
例如,CYK的构造就是这样,但是组织起来使得所有规则和创建的非终结符都是有效的,尽管许多规则可能无法实现。这是自下而上的技术所期望的。
自上而下的技术(例如基于LR(k)的技术)将避免不可达的规则和非终结符,但会产生无效的规则。
我认为,实际上可以通过适当使用指针来完成很多刷牙工作,但是我已经很长时间没有对此进行研究了。
实际上,所有现有算法实际上都遵循该模型。因此,这确实是问题的核心,而且非常简单。那为什么要把它埋在复杂中呢?
在文献中经常基于解析器构造的LR(k),LL(k)系列提出许多“优化”,可能对这些构造有一些静态分解(Earley没有静态分解)。它实际上可以应用于所有已知的技术,包括旧的优先级解析器。我将“优化”放在引号之间,是因为它通常不清楚您要优化的内容,甚至您实际上是否在优化它,或者改进的好处是否值得解析器增加复杂性。您会发现很少有正式或实验性的客观数据(有一些),但还有更多主张。我并不是说没有兴趣。有一些聪明的主意。
现在,一旦您了解了基本概念,通常可以通过从语法构造下推自动机,遵循您感兴趣的解析器构造技术,然后静态地(可能以增量方式)引入“优化”或改进。与该自动机相交的叉积构造(几乎与对语法执行此操作相同)或对该自动机派生的语法相交。
然后,您可以介绍钟声和口哨声,但这主要是技术细节。
据报道,艾萨克·牛顿(Isaac Newton)的《自然哲学原理》是一门重要的物理和数学课程。我认为这并不是很多学生的阅读清单。在其他所有条件都相同的情况下,尽管这是一个重要的历史著作,但我认为教授Earley的算法并不是很有用。学生有足够的学习空间。对于Knuth LR(k)论文,我认为有被许多人击落的风险,这几乎是一样的。这是一篇出色的理论分析文章,对于理论家来说可能是重要的一本著作。我强烈怀疑,鉴于硬件和软件的当前技术水平,对于构建解析器是否如此重要。解析是编译时间的重要部分,现在已经过去了,或当编译器的速度是一个关键问题时(我知道一家公司在30年前因编译成本而丧命)。解析专家可能希望在某个时候学习该专业知识,但是计算机科学,编程或工程学的普通学生不需要它。
如果学生必须花更多的时间进行解析,那么还有其他一些扩展可能会更有用和更具格式性,例如在计算语言学中使用的那些扩展。教学的首要作用是提取构成科学知识的简单思想,而不是强迫学生遭受研究科学家必须遭受的苦难(博士生除外:这是一种通过仪式:-)。
作者许可CC BY-SA 3.0