如何更改规则的解析器

时间:2019-05-12 20:55:35

标签: c++ boost-spirit boost-spirit-x3

是否可以在运行时修改规则的解析器?我能够动态创建解析器(从parser_base派生的类),但是我不知道如何将新的解析器分配给现有规则。

基本上,我的问题是我想为由数字(例如,在我所有解析器输入中它们不变的意义上称它们为常量)和符号(我想要的变体)组成的行定义一个解析器使用动态解析器​​方法捕获)。由于这些符号基于运行时的当前环境,因此我认为我需要一个动态解析器​​。

最小的问题,我想要符号和行尾:

namespace parser
{
    x3::rule<class line, ast::line> line = "line";
    auto const line_def = variants_def >> lineend_def;
    BOOST_SPIRIT_DEFINE(line);
}

using line_type = boost::spirit::x3::rule<class client::parser::line, ast::line>;
line_type line(boost::spirit::x3::plus<boost::spirit::x3::symbols_parser<boost::spirit::char_encoding::standard, client::ast::command, boost::spirit::x3::tst<boost::spirit::char_encoding::standard::char_type, client::ast::command>>> symbols_parser)
{
    auto line_end = lineend();
    auto const line_def2 = symbols_parser >> line_end;
    return parser::line; // <-- how can I change the line_type to use line_def2?
}

此代码可能远非最少,但是很遗憾,我还不太熟悉C ++。

1 个答案:

答案 0 :(得分:0)

你不能。

实际上,我撒谎了,您可以在动态库中拥有具有相同id的不同解析器,并通过来回切换动态库来更改规则的解析器,但是请不要这样做。