2011-05-11 76 views
11

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

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

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

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

谢谢。

+0

@justsomebody感谢您的编辑:) – sehe 2012-10-11 12:39:29

回答

10

对不起,对于迟到的回复,但花了一些时间准备一个你想要实现的体面的例子。我现在为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。

+0

非常感谢,Hartmut! – 2011-06-07 05:19:37

+2

只是一个更新:该示例已在SVN中更名为conjure2。 – hkaiser 2011-06-07 13:03:37