是否可以在运行时修改规则的解析器?我能够动态创建解析器(从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 ++。
答案 0 :(得分:0)
你不能。
实际上,我撒谎了,您可以在动态库中拥有具有相同id的不同解析器,并通过来回切换动态库来更改规则的解析器,但是请不要这样做。 >