Вы можете попробовать использовать confix_p
:
confix_p(as_lower_d["//the description;"],
(+print_p)[assign(vDescription)],
ch_p(';')
)
Это должно быть эквивалентно ответ Фреда .
Причина, по которой ваш код не работает, заключается в том, что print_p
является жадным . Синтаксический анализатор +print_p
будет потреблять символы до тех пор, пока не встретит конец ввода или непечатаемый символ. Точка с запятой пригодна для печати, поэтому print_p
заявляет об этом. Ваш ввод исчерпан, переменная назначена, и совпадение не выполнено - для последней запятой вашего синтаксического анализатора ничего не осталось.
Ответ Фреда создает новый синтаксический анализатор, (print_p - ';')
, который соответствует всему, что print_p
делает, кроме точек с запятой. «Сопоставить все, кроме X , а затем сопоставить X » - это обычный шаблон, поэтому confix_p
предоставляется в качестве ярлыка для создания парсера такого типа. Документация предлагает использовать его для анализа комментариев в стиле C или Pascal, но это не обязательно.
Чтобы ваш код работал, Духу нужно было бы признать, что жадный print_p
слишком сильно соответствовал, а затем вернуться назад , чтобы позволить сопоставление меньше. Но хотя Spirit будет возвращаться назад, он не будет возвращаться к «середине» того, что в противном случае подпарсер мог бы жадно сопоставить. Он вернется к следующей «точке выбора», но в вашей грамматике ее нет. См. Исчерпывающий откат и жадный RD в документации Spirit.