我正在为使用缩进等的相当复杂的配置文件编写解析器。我决定使用Lex将输入分解为令牌,因为它似乎使生活更轻松。问题是我找不到任何使用Qi错误报告工具(on_error
)和使用令牌流而不是字符进行操作的解析器的示例。
要在on_error
中使用的错误处理程序需要一些能够准确指出错误在输入流中的位置。所有示例都只是从迭代器对中构造std::string
并打印它们。但是如果使用Lex,则迭代器是标记序列的迭代器,而不是字符。在我的程序中,这导致在我注意到无效的迭代器类型之前挂起std::string
构造函数。
据我所知,令牌可以将输入流的一对迭代器作为其值。这是默认属性类型(如果类型类似于lex::lexertl::token<>
)。但是如果我希望我的令牌包含对解析(int
,std::string
等)更有用的东西,那些迭代器就会丢失。
如何在使用带Qi的Lex时生成指示输入流中位置的人性化错误消息?有没有这种用法的例子?
感谢。
答案 0 :(得分: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。