代码之家  ›  专栏  ›  技术社区  ›  Philip Schlump

C++中最好的LALR解析器生成器,它可以生成有意义的错误消息

  •  1
  • Philip Schlump  · 技术社区  · 15 年前

    我正在寻找最好的解决方案,为LALR解析器生成器的C++,这将允许我产生真正好的错误信息。我真的很讨厌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上工作。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Laurence Gonsalves    15 年前

    你为什么要拉勒?ll(k)解析器的一个好处是,它们通常可以使生成清晰的错误消息变得更容易。大多数可以由LALR解析器解析的语法都可以很容易地重构为可以由LL(K)解析器解析。

    ANTLR 是一个流行的LL(k)解析器生成器,可以生成C++(以及许多其他语言)。从 Chapter 10 of The Definitive ANTLR Reference :

    语言的质量 应用程序的错误消息和 恢复策略常常使 专业人士之间的区别 申请和业余爱好者 应用。错误恢复是 从语法中恢复的过程 更改输入流或 使用符号直到解析器可以 以已知状态重新启动。许多 手工制造,许多非ll基 识别器发出的信号低于最佳值 错误消息,而 ANTLR生成的识别器 自动发出非常好的错误 消息和智能恢复,如 如本章所示。

    许多 grammars are also available for ANTLR 包括 a MySQL grammar .

        2
  •  0
  •   Richard Corden    15 年前

    如果你发现Antlr不能完全解决你的问题,那么你可以考虑 basil . 它是一个LR(1)解析器生成器,它被设计和编写来创建C++解析器。