как изменить парсер правила - PullRequest
0 голосов
/ 12 мая 2019

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

Вы не можете.

На самом деле, я солгал, вы можете иметь разные парсеры с одинаковым идентификатором в динамических библиотеках и изменять парсер правила, переключая динамические библиотеки туда и обратно, но, пожалуйста, не делайте этогосделай это.

...