C++ Boost.Spirit X3中的错误处理和注释

C++ Boost.Spirit X3中的错误处理和注释,c++,boost-spirit-qi,boost-spirit-x3,C++,Boost Spirit Qi,Boost Spirit X3,使用boost::spirit::x3::position_taged作为某些AST节点的基类(如何选择应标记哪些,例如,对于类似C的语言?)和规则ID定义中使用的其他构造,例如: struct error_handler_tag; struct error_handler_base { template< typename Iterator, typename Exception, typename Context > x3::error_handler_res

使用
boost::spirit::x3::position_taged
作为某些AST节点的基类(如何选择应标记哪些,例如,对于类似C的语言?)和规则ID定义中使用的其他构造,例如:

struct error_handler_tag;

struct error_handler_base
{

    template< typename Iterator, typename Exception, typename Context >
    x3::error_handler_result
    on_error(Iterator & /*first*/, Iterator const & /*last*/,
             Exception const & x, Context const & context)
    {
        std::string message_ = "Error! Expecting: " + x.which() + " here:";
        auto & error_handler = x3::get< error_handler_tag >(context).get();
        error_handler(x.where(), message_);
        return x3::error_handler_result::fail;
    }

};

struct annotation_base
{

    template< typename T, typename Iterator, typename Context >
    void
    on_success(Iterator const & first, Iterator const & last,
               T & ast, Context const & context)
    {
        auto & error_handler = x3::get< error_handler_tag >(context).get();
        error_handler.tag(ast, first, last);
    }

};
// ...
error_handler_type error_handler(beg, end, std::cerr);
auto const parser_ = x3::with< error_handler_tag >(std::ref(error_handler))[grammar];
// ...
struct error\u handler\u标记;
结构错误\u处理程序\u基
{
模板
x3::错误\u处理程序\u结果
关于_错误(迭代器&/*first*/,迭代器const&/*last*/,
异常常量和x、上下文常量和上下文)
{
std::string message=“Error!应为:“+x.which()+”此处:”;
auto&error\u handler=x3::get(上下文).get();
错误处理程序(x.where(),消息);
返回x3::error\u handler\u result::fail;
}
};
结构注释库
{
模板
无效的
在成功时(迭代器常量&first,迭代器常量&last,
T&ast、上下文常量和上下文)
{
auto&error\u handler=x3::get(上下文).get();
错误\u handler.tag(ast、first、last);
}
};
// ...
错误处理程序类型错误处理程序(beg、end、std::cerr);
自动常量解析器_x3::with(std::ref(error\u handler))[grammar];
// ...
?


如果输入错误(语法不匹配),这部分代码不会执行任何操作(即使是最简单的语法,它应该识别标识符)-不打印错误表。

语法正确的解析并不意味着AST也可以成功计算。想象一个语法定义了一些可以计算数学表达式的计算器,比如“3+4/(5-5)”。它可以很好地解析,但是在AST计算期间,您可能希望在“5-5”上引发一个错误,作为除法的参数。为此,可以方便地确定您所抱怨的元素的位置

我自己的代码也有类似的问题,它基于和,但我不完全确定失败是从哪里来的,也就是说,如果是我自己的错误。你查过邮寄名单了吗?我没有编译这两个教程项目,因此没有检查它们是否正确。@Christoph不能立即完成,但在不久的将来我可以。真棒:)在
x3::annotate_on_success
中定义并在
struct rexpr_类中继承的
方法:x3::annotate_on_success,error_handler_base{被成功调用,但是在用户的类中定义的
on\u错误处理程序(至少在我的项目中)没有被调用,即使我将它的所有声明和定义直接移动到我的等价类
rexpr\u类中
。明天或后天,我可以尝试检查
on_error
on_success
的出现情况,因为现在我在
x3
目录中找不到它们,只有
on_error
有一个签名不同。简短更新:中定义的
on_error
处理程序调用正确。