Почему этот анализатор оставляет 'b'
в атрибутах, даже если опция не была сопоставлена?Boost Spirit дополнительный синтаксический анализатор и обратный отсчет
using namespace boost::spirit::qi;
std::string str = "abc";
auto a = char_("a");
auto b = char_("b");
qi::rule<std::string::iterator, std::string()> expr;
expr = +a >> -(b >> +a);
std::string res;
bool r = qi::parse(
str.begin(),
str.end(),
expr >> lit("bc"),
res
);
Он разбирает успешно, но res is "ab"
.
Если parse "abac"
с одним экспиром, опция сопоставляется и атрибут "aba"
.
То же самое с "aac"
, опция не начинается, и атрибут "aa"
.
Но с "ab"
атрибутом является "ab"
, хотя b получает обратный отсчет и, как в примере, соответствует следующему синтаксическому анализатору.
UPD
С expr.name("expr");
и debug(expr);
я получил
<expr>
<try>abc</try>
<success>bc</success>
<attributes>[[a, b]]</attributes>
</expr>
Ну, я уже заменил 'auto' на правила. –
Но, я не понимаю, вы используете двоичный минус? Это другой язык, не так ли? –
@MikhailCheshkov Я просто замечал эту опечатку. ** Обновлен ** ответ. Извините мою ошибку:/ – sehe