C++ 传递参数以增强spirit自定义解析器

C++ 传递参数以增强spirit自定义解析器,c++,boost-spirit,boost-spirit-qi,C++,Boost Spirit,Boost Spirit Qi,我正在尝试按照此处的说明创建自定义解析器:。在本文中,解析器没有参数,也就是说,我不能编写类似于qi::parse(首先,input.end(),+qi::alpha>>自定义解析器::iter_pos(“我的参数”)。如何修改示例以传递参数?我试过这个: using namespace boost::spirit; namespace parsernm { BOOST_SPIRIT_TERMINAL(aparser); } namespace boost { namespace spiri

我正在尝试按照此处的说明创建自定义解析器:。在本文中,解析器没有参数,也就是说,我不能编写类似于
qi::parse(首先,input.end(),+qi::alpha>>自定义解析器::iter_pos(“我的参数”)。如何修改示例以传递参数?我试过这个:

using namespace boost::spirit;

namespace parsernm { BOOST_SPIRIT_TERMINAL(aparser); }

namespace boost { namespace spirit {
    template <typename A0>
    struct use_terminal<
        qi::domain
      , terminal_ex<
            parsernm::tag::aparser
          , fusion::vector1<A0>
          >
      > : mpl::true_
    {};
}}

namespace parsernm
{
    struct aparser_impl : boost::spirit::qi::primitive_parser<aparser_impl>
    {
        aparser_impl(int _param)
          : param(_param)
        {}

        template <typename Iterator, typename Context, typename Skipper, typename Attribute>
        bool parse(Iterator& first, Iterator const& last, Context&,
                   Skipper const& skipper, Attribute& attr) const
        {
            return true;
        }

        template <typename Context>
        boost::spirit::info what(Context&) const {
            return boost::spirit::info("aparser");
        }

        int param;
    };
}

namespace boost { namespace spirit { namespace qi {
    template <typename Modifiers>
    struct make_primitive<parsernm::tag::aparser, Modifiers>
    {
        typedef parsernm::aparser_impl result_type;

        template <typename Terminal>
        result_type operator()(Terminal const& term, unused_type) const
        {
            return result_type(fusion::at_c<0>(term.args));
        }
    };
}}}

int main(int argc, char* argv[])
{
    std::string input("");
    std::string::iterator first = input.begin();
    bool result = qi::parse(first, input.end(), parsernm::aparser(10));

    return 0;
}
使用名称空间boost::spirit;
名称空间parsernm{BOOST_SPIRIT_TERMINAL(aparser);}
名称空间提升{名称空间精神{
模板
结构使用终端<
qi::域
,候机楼<
parsernm::tag::apaser
,fusion::vector1
>
>:mpl::true_
{};
}}
名称空间解析
{
struct aparser_impl:boost::spirit::qi::primitive_解析器
{
aparser_impl(int_param)
:param(_param)
{}
模板
布尔解析(迭代器&第一,迭代器常量&最后,上下文&,
Skipper常量和Skipper,Attribute和attr)常量
{
返回true;
}
模板
boost::spirit::info什么(上下文和)常量{
返回提升::精神::信息(“aparser”);
}
int参数;
};
}
名称空间提升{名称空间精神{名称空间qi{
模板
结构make_原语
{
typedef parsernm::apaser_impl result_type;
模板
结果类型运算符()
{
返回结果类型(fusion::at_c(term.args));
}
};
}}}
int main(int argc,char*argv[])
{
std::字符串输入(“”);
std::string::iterator first=input.begin();
bool result=qi::parse(首先是input.end(),parsernm::apaser(10));
返回0;
}

结果是boost\spirit\home\qi\detail\parse.hpp(32):错误C2338:错误\u无效\u表达式。

我知道了<代码>加油机加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站加油站。和
make_primitive
应如下所示:

namespace boost { namespace spirit { namespace qi {
    template <typename Modifiers, typename A0>
    struct make_primitive<
        terminal_ex<
            parsernm::tag::aparser
          , fusion::vector1<A0>
          >
      , Modifiers
      >
    {
        typedef parsernm::aparser_impl result_type;

        template <typename Terminal>
        result_type operator()(Terminal const& term, unused_type) const
        {
            return result_type(fusion::at_c<0>(term.args));
        }
    };
}}}
namespace boost{namespace spirit{namespace qi{
模板
结构make_原语<
终点站<
parsernm::tag::apaser
,fusion::vector1
>
,修饰语
>
{
typedef parsernm::apaser_impl result_type;
模板
结果类型运算符()
{
返回结果类型(fusion::at_c(term.args));
}
};
}}}

感谢您将答案放在这里,以便于参考。我相信这对某些人(我?)会有帮助。我现在正在努力使它能够在有争论或没有争论的情况下使用。你能给出一个想法吗?更一般的:如何从编译器喷涌的错误\u无效的\u表达式中确定要使用的\u终端?你可以看看它是如何完成的。似乎有效。