Можно ли изменить парсер правила во время выполнения? Я могу динамически создавать парсеры (классы, производные от 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 ++.