grammar - 确定是否可以在 CFG 中模糊地派生字符串

标签 grammar context-free-grammar

我知道给定一个特定的上下文无关语法,要检查它是否有歧义,需要检查是否存在任何可以以不止一种方式派生的字符串。这是不可判定的。

但是,我有一个更简单的问题。给定一个特定的上下文无关文法和一个特定的字符串,是否可以确定字符串是否可以从文法中模糊地导出?是否有通用算法来执行此检查?

最佳答案

是的,您可以使用任何通用的解析算法,例如 GLR (Tomita) parser , 一个 Earley parser ,甚至 a CYK parser ;所有这些都可以在 O(N3) 时间和空间内生成解析“森林”(即所有可能解析器的有向图)。创建解析森林比“解析”(即识别)要复杂一些,但维基百科文章中引用了已知的算法。

由于广义解析算法找到所有可能的解析,您可以放心,如果恰好为字符串找到一个解析,则该字符串没有歧义。

我会远离此算法的 CYK 解析,因为它需要将语法转换为 Chomsky 范式,这使得恢复原始解析树更加复杂。

Bison 会生成一个 GLR parser ,如果需要,您就可以使用该工具。但是,请注意,它不会优化解析森林的存储,因为它预计只会生成一个解析,因此您最终可能会得到指数级大小的数据结构(然后需要指数级的时间来构建)。不过,这通常只是病态语法的问题。此外,您还必须申报 custom %merge function在所有可能有歧义的产品上;否则,如果可以进行不止一次解析,Bison 生成的解析器将失败并出现“歧义解析”错误。

关于grammar - 确定是否可以在 CFG 中模糊地派生字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440625/

相关文章:

antlr - ANTLR4:零或一倍

bison - 尝试使用 bison 为 DirectX x 格式的子集制作语法的移位/减少冲突

compiler-construction - 如何将语法转换为自上而下的可解析语法

parsing - 如何解析上下文相关的语法?

parsing - 解决 yacc/ocamlyacc 中的 reduce/reduce 冲突

grammar - 上下文无关语言的闭包性质

programming-languages - 是否有任何工具可以根据自定义语法生成 UML 图?

java - ANTLR 可以生成最终的解析器类吗?

grammar - 将语法转换为乔姆斯基范式?

java - Java、C++、C# 等如何使用 < 和 > 来解决这种特殊的语法歧义?