提升精神:Lex + Qi错误报告
Boost.Spirit: Lex + Qi error reporting
我正在为使用缩进等的相当复杂的配置文件编写解析器。我决定使用 Lex 将输入分解为令牌,因为它似乎让生活更轻松。问题是我找不到任何使用 Qi 错误报告工具 ( on_error
) 和解析器的示例,这些解析器在令牌流而不是字符上运行。
要在on_error
中使用的错误处理程序需要一些才能准确指示错误在输入流中的位置。所有示例都只是从一对迭代器构造std::string
并打印它们。但是如果使用 Lex,则迭代器是标记序列的迭代器,而不是字符。在我的程序中,这导致在我注意到无效的迭代器类型之前挂起std::string
构造函数。
据我了解,令牌可以将一对迭代器作为其值保存在输入流中。这是默认属性类型(如果类型类似于 lex::lexertl::token<>
)。但是,如果我希望我的令牌包含对解析更有用的东西(int
、std::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。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 在 boost::qi 中使用过多的替代运算符会导致分段错误
- 递归精神.Qi语法的分割错误
- 提升::精神::QI规则减少解析错误
- 更丰富的错误返回消息用于提升::精神::qi 解析
- boost::spirit::qi具有相同的简单自适应结构属性的规则会导致编译错误
- 对于c风格字符串,boost::spirit::qi和qi::alnum会导致模板编译错误
- 提振.使用可选解析器的Qi编译器错误
- 提升精神:Lex + Qi错误报告