нарушение доступа при разборе спиртового правила с помощью `alias ()`

Я пытаюсь проанализировать строку «1-2», используя грамматику, которая построена по следующим правилам:

spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op1 = "-";
spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op2 = "+";

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> numberParser = boost::spirit::qi::double_;

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> expressionParser;
expressionParser = numberParser >> -( (op1 >> expressionParser) | (op2 >> expressionParser));

start = expressionParser.alias();

где начало является членом моего класса грамматики:

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> start;

с правилами здесь я хочу создать узел для каждой из двоичных операций + и — слева направо.

Когда я сейчас разбираю строку «1-2», используя следующий метод:

void Parse(const std::string& testString, const CDynamicExpressionSyntaxParser<const char*>& parser)
{
char const* first = testString.c_str();
char const* last = &first[testString.size()];
boost::spirit::utree tree;
bool success = boost::spirit::qi::phrase_parse(first,last,parser, boost::spirit::qi::space,tree);
std::cout << "tree: " << tree << '\n';
}

Я получаю нарушение прав доступа в rule.hpp. Что я делаю неправильно?

1

Решение

Я думаю, что причина может быть найдена здесь: Копировать или ссылаться на семантику boost :: spirit’s rule<>? — особенно с:

Когда на правило ссылается где-либо в правой части выражения EBNF, правило удерживается выражением по ссылке. Клиент несет ответственность за обеспечение того, чтобы указанное правило оставалось в области действия и не разрушалось во время обращения к нему.

Это был не тот случай.

2

Другие решения

Вместо этого….

char const* last = &first[testString.size()];

Попробуй это….

char const* last = &first[testString.size()-1];
0

По вопросам рекламы [email protected]