我正在为C ++的LALR解析器生成器寻找最佳解决方案,这将允许我生成非常好的错误消息。我真的很讨厌MySQL生成的语法错误,我想在其中使用解析器并用“lint”检查器替换它,它将告诉我的不仅仅是
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a from users' at line 1
我使用过YACC / LEX和BISON / FLEX。 它必须在Mac或Linux上运行。
答案 0 :(得分:3)
为什么需要LALR? LL(k)解析器的一个好处是它们通常可以更容易生成清晰的错误消息。大多数可由LALR解析器解析的语法都可以轻松地重构,以便LL(k)解析器可以解析。
ANTLR是一种流行的LL(k)解析器生成器,可以生成C ++(以及许多其他语言)。来自Chapter 10 of The Definitive ANTLR Reference:
语言的质量 应用程序的错误消息和 恢复策略经常使得 专业人士之间的区别 申请和业余 应用。错误恢复是 从语法中恢复的过程 通过改变输入流或错误 消费符号直到解析器可以 在已知状态下重启。许多 手工打造和许多非基于LL的 识别器发出的不是最佳 错误消息,而 ANTLR生成的识别器 自动发出非常好的错误 消息和智能恢复,如 如本章所示。
答案 1 :(得分:0)
如果您发现ANTLR无法完全解决您的问题,那么您可能会考虑basil。它是一个LR(1)解析器生成器,设计和编写用于创建C ++解析器。