C++ boost::xpressive语法是否可以报告语法错误?

C++ boost::xpressive语法是否可以报告语法错误?,c++,parsing,boost,grammar,xpressive,C++,Parsing,Boost,Grammar,Xpressive,我正在尝试解析一种自定义语言(与JSON没有太大区别),我决定尝试使用boost expressive,因为它看起来很有趣 然而,当xpressive匹配失败时,它只是失败。有什么方法可以实现某种错误报告吗?比如“表达式匹配到第47个字符(我可以从中得到行号) 我可以看到,在查找它想要的标记或匹配项并在本例中报告错误后,如何定制每个子表达式以查找其他标记或匹配项,但这似乎是一种非常复杂的方法 表达型(或任何人都可以建议一种方法)中是否有任何功能允许我这样做 谢谢。我建议改用ANTLR。这是一个很

我正在尝试解析一种自定义语言(与JSON没有太大区别),我决定尝试使用boost expressive,因为它看起来很有趣

然而,当xpressive匹配失败时,它只是失败。有什么方法可以实现某种错误报告吗?比如“表达式匹配到第47个字符(我可以从中得到行号)

我可以看到,在查找它想要的标记或匹配项并在本例中报告错误后,如何定制每个子表达式以查找其他标记或匹配项,但这似乎是一种非常复杂的方法

表达型(或任何人都可以建议一种方法)中是否有任何功能允许我这样做


谢谢。

我建议改用ANTLR。这是一个很好的折衷方案,既有酷炫、前沿的东西,如Boost Spirit/Qi,也有坚固的工具,如lex和yacc。它可以做一些你想要的更智能的错误报告,而无需付出太多的努力


注意,目前有ANTLR版本2和3都是通用的;2包括C++代码生成,而3则不需要,所以现在您可能需要坚持“旧”版本(如果V3最终有C++目标,移植应该相当简单)。我在过去使用过flex/bison,它的方式很好,我知道其他解析器生成器,比如ANTLR(我甚至用python编写了一个)。就这点而言,语言的简单性意味着手工编写递归下降解析器并报告错误(我可能会这样做)并不麻烦。但是XPress在C++中没有额外的构建步骤(当在多个操作系统上建立时可能是一个痛苦),如果可能的话,我想使用它。我试过boost::spirit,但编译器错误的额外复杂性和长度/难以辨认性让我很反感。boost本身对某些系统上的一些用户来说是一种痛苦。例如,使用较旧版本的编译器(如操作系统供应商提供的编译器)的用户可能无法生成您的代码。我认为,虽然构建脚本可能需要为ANTLR编写几行特殊代码,但使用ANTLR而不是Xpressive可能最终会使整个项目更具可移植性,而不是更少。当然,你们所说的精神与我的经验是一致的——那个东西一开始似乎已经准备好生产了,但我不太确定。所有的观点都是正确的!我担心的不是便携性,而是懒惰!当我说“在多个操作系统上构建一个痛苦的过程”时,我当然是指windows。在windows构建链中添加某些内容似乎总是比工作/测试高出五倍。另外,我可能最终会依靠boost来完成一到两件事情。正如我所怀疑的那样,我最终手工制作了一个(这可能比阅读ANTLR手册或重读flex/bison手册花费的时间要少)。我只是想知道我是否可以用XPressive来做,即使这不是最好的方法。