我正在使用Boost精神来解析本质上是一个数学表达式(m_formula
中的一些文本是std::string
)
我设置
double value;
auto first = m_formula.begin();
auto last = m_formula.end();
然后,对于语法grammar
,我解析m_formula
:
boost::spirit::qi::phrase_parse(first, last, grammar, ascii::space, value);
目前我有
if (first != last){
/*ToDo - display "invalid formula " + m_formula*/
}
有没有办法可以改进错误处理,例如告诉我哪一部分公式导致解析器失败?
答案 0 :(得分:3)
您可以使用期望点,这会引发qi::expectation_failure<It>
例外。
它们包含告诉哪些规则失败的信息(以及指向该解析器表达式的匹配开始以及投掷点的源迭代器)。
qi::on_error
是一种在语法中处理这些期望失败的机制(如果你不想在外部捕获它们。
现在,如果您的输入是多行的,您可能希望跟踪输入行/列信息。 line_pos_iterator
执行此操作。如果这样做,请查看repository::qi::iter_pos
指令,以便将行/列信息作为规则中的属性公开。
我暂时将其留在此处:如果您愿意,可以使用上述任意关键字搜索boost-spirit代码。