提升精神:Lex + Qi错误报告

Boost.Spirit: Lex + Qi error reporting

本文关键字:Qi 错误 报告 Lex      更新时间:2023-10-16

我正在为使用缩进等的相当复杂的配置文件编写解析器。我决定使用 Lex 将输入分解为令牌,因为它似乎让生活更轻松。问题是我找不到任何使用 Qi 错误报告工具 ( on_error) 和解析器的示例,这些解析器在令牌流而不是字符上运行。

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

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

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

谢谢。

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

新的conjure_lexer示例演示了以下几件事:a) 它正在使用一个新的 position_token 类,该类扩展了现有的token类型。它始终存储指向相应匹配输入序列的迭代器对(除了令牌 ID、令牌值等常规信息)。b) 它使用此位置信息进行错误报告c) 并沿着这条线,它演示了使用词法分析器如何简化语法。

新示例在SVN(主干)中,并将在Boost V1.47(即将发布)中提供。它位于以下目录中:$BOOST_ROOT/libs/spirit/example/qi/compiler-tutorial/conjure_lexer。