也就是说,有没有一种工具可以自动显示给定语法的完整语言,包括突出显示歧义(如果有的话)?告诉BNF文法是否含糊不清的最简单方法是什么?
回答
BNF风格的语法可能有一些特殊性,但总的来说,决定给定的上下文无关文法(如BNF)是否不明确是不可能的。
总之,不存在一个工具,因为一般来说,该工具在数学上是不可能的。不过,可能有些特殊情况可能适用于您。
更具体地说,你可以检查不管语法是否模棱两可,但是你不能证明它不是。 – OrangeDog 2011-01-26 00:22:50
@OrangeDog:那么,一般来说你不能证明它,但是对于某些语法来说是可能的(下面是一个你可以很容易地证明它的小语法:“goal = a;”)。 – 2012-04-16 23:30:04
一般来说,没有。
但是作为一种实用的方法,你可以做什么,给定一个语法,是为每个规则,列举可能的有效终端/非终结符串,看看是否有任何规则有两个或更多等价的派生(这将是含糊不清)。
我们的DMS Software Reengineering Toolkit是任意计算机语言的程序转换系统,由明确的语法描述驱动。 DMS使用解析器生成器来驱动其GLR解析引擎。
DMS的解析器生成器可选地通过在所有语法规则上运行迭代加深搜索,在上面勾画出模糊性检查。这很实用,因为它具有分析表来有效地指导选项的枚举。您可以告诉它将此检查运行到某个选定的深度。如果您选择任意有趣尺寸的深度,可能需要很长时间,但实际上,3或4的深度足以发现大语法中引入的许多愚蠢歧义。在我们最初的语法调试过程中,我们通常会这样做,并且在我们认为我们已经非常正确的时候。
- 1. 告诉应用程序是否在Lotus Notes中使用存储表单的最简单方法是什么?
- 2. 在webkit中清除浮动的最简单方法是什么?
- 3. 在CDI扩展中,告诉注入点是否满足的最简单方法是什么?
- 4. 使模块警告致命的最简单方法是什么?
- 5. 告诉对象是否被修改的最好方法是什么?
- 6. 在Objective-C中否定BOOL的最简单方法是什么?
- 7. 从C++调用Java方法的最简单方法是什么?
- 8. 什么是从Javascript调用C#方法的最简单方法
- 9. 在C++中,告诉两个字符串或二进制文件是否不同的最快方法是什么?
- 10. 获取XmlElement顶级文本的最简单方法是什么?
- 11. MVC2:什么是从文本框回发最简单的方法
- 12. 什么是加密word和pdf文件的最简单方法?
- 13. 什么是从gfortran读取.dbf文件的最简单方法
- 14. 什么是生成DOC文件的最简单方法?
- 15. 调试ActionScript类文件最简单的方法是什么?
- 16. 访问Azure文件存储的最简单方法是什么?
- 17. 在c#中加密文件最简单的方法是什么?
- 18. 在iPad上生成报告的最快和最简单的方法是什么
- 19. 计算器键盘算法最简单的方法是什么?
- 20. 什么是更新不可变AST的最简单方法?
- 21. 什么是清理不可解析的csv文件的简单方法
- 22. jQuery的表单验证最简单的方法是什么?
- 23. 什么是春季最简单/最透明的缓存方法?
- 24. Django:测试对象是否在集合中的最简单方法是什么
- 25. 检查两幅图像是否相同的最简单方法是什么?
- 26. 检查两个CRgn是否相交的最简单方法是什么?
- 27. 查找特定LocalDate是否属于YearMonth的最简单方法是什么?
- 28. 确定寄存器值是否等于零的最简单方法是什么?
- 29. 什么是创建标签式菜单的最简单方法?
- 30. 什么是自定义NSTableView单元最简单的方法?
也许这是相关的:http://cstheory.stackexchange.com/questions/4352/how-is-proving-a-context-free-language-to-be-ambiguous-undecidable – 2011-01-25 03:23:32