问题 Boost.Spirit:Lex + Qi错误报告


我正在编写一个解析器,用于使用缩进等非常复杂的配置文件。我决定使用Lex将输入分解为令牌,因为它似乎使生活更轻松。问题是我找不到任何使用Qi错误报告工具的例子(on_error)使用解析器来处理令牌流而不是字符。

要使用的错误处理程序 on_error 需要一些能够准确指出错误在输入流中的位置。所有例子都是构建的 std::string 从这对迭代器中打印出来。但是如果使用Lex,则迭代器是标记序列的迭代器,而不是字符。在我的节目中,这导致了进入 std::string 构造函数之前我注意到无效的迭代器类型。

据我所知,令牌可以将输入流的一对迭代器作为其值。这是默认属性类型(如果类型是这样的 lex::lexertl::token<>)。但是,如果我希望我的令牌包含更有用的解析(intstd::string等等),那些迭代器丢失了。

如何在使用带Qi的Lex时生成指示输入流中位置的人性化错误消息?有这种用法的例子吗?

谢谢。


3804
2018-05-11 12:29


起源

@justsomebody感谢编辑:) - sehe


答案:


很抱歉迟到的回复,但我花了一些时间来准备一个你想要实现的目标的一个体面的例子。我现在为Spirit添加了一个新的词法分析器示例: conjure_lexer。它是的修改版本 conjure (Qi)实现小编程语言的例子。主要区别在于它使用词法分析器而不是纯Qi语法。

新的 conjure_lexer 示例演示了几件事: a)它正在使用新的 position_token class,它扩展了现有的 token 类型。它总是存储指向相应匹配输入序列的迭代器对(除了诸如令牌id,令牌值等常用信息之外)。 b)它正在使用此位置信息进行错误报告 c)并且沿着这些方向,它演示了如何使用词法分析器来简化语法。

新的例子在SVN(主干)中,将在Boost V1.47中提供(即将发布)。它在这个目录中:$ BOOST_ROOT / libs / spirit / example / qi / compiler-tutorial / conjure_lexer。


10
2018-06-05 15:36



非常感谢,哈特穆特! - Paul Graphov
只是更新:该示例已在SVN中重命名为conjure2。 - hkaiser