1

我正在为 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 上运行。

4

2 回答 2

3

为什么需要 LALR?LL(k) 解析器的好处之一是它们通常可以更容易地生成清晰的错误消息。大多数可以被 LALR 解析器解析的语法都可以很容易地重构为可以被 LL(k) 解析器解析。

ANTLR是一种流行的 LL(k) 解析器生成器,可以生成 C++(以及许多其他语言)。来自The Definitive ANTLR Reference 的第 10 章

语言应用程序的错误消息和恢复策略的质量通常决定了专业应用程序和业余应用程序之间的差异。错误恢复是通过更改输入流或使用符号从语法错误中恢复的过程,直到解析器可以在已知状态下重新启动。许多手工构建的和许多非基于 LL 的识别器发出的错误消息不是最优的,而 ANTLR 生成的识别器会自动发出非常好的错误消息并智能地恢复,如本章所示。

许多语法也可用于 ANTLR,包括MySQL 语法

于 2009-12-07T07:04:31.917 回答
0

如果您发现 ANTLR 不能完全解决您的问题,那么您可以考虑basil。它是一个 LR(1) 解析器生成器,旨在创建 C++ 解析器。

于 2009-12-09T11:09:58.647 回答