Чем отличаются boost :: spirit :: qi :: parse () и boost :: spirit :: qi :: фраза_parse ()? - PullRequest
1 голос
/ 20 марта 2020

Я новичок в Ци.

Моя цель - использовать spirit :: qi для создания парсера CLI. Под «синтаксическим анализатором CLI» я имею в виду не тот тип, который обрабатывает параметры командной строки (например, app --help), а то, что обрабатывает команды, набранные пользователем.

Пример:

CLI> vacuum on
vacuum solenoid energized
CLI> 

Я изучал ряд примеров Spirit :: Qi и пытался понять Ци. Я вижу, что qi предоставляет два похожих API: qi :: parse () и qi :: фраза_parse (). В примере кода, который я рассмотрел, используются оба API, но я пока не понимаю, как они различаются.

Другими словами, я думаю, что каждый из этих API специализирован для решения конкретных c задач анализа, но Я не понимаю, когда пытаюсь выбрать один из этих API-интерфейсов для решения конкретной проблемы синтаксического анализа, какой я должен выбрать.

Заранее спасибо.

1 Ответ

1 голос
/ 21 марта 2020

«Прямой» API синтаксического анализа не принимает шкипер, тогда как phrase_parse делает.

Шкипер - это второе выражение синтаксического анализатора, которое описывает входные последовательности, которые должны игнорироваться вне лексем (например, пробел или комментарии, но не ограничиваясь этим).

Чтобы узнать о поведении шкиперов, см., например, Проблемы с шкипером буст-спирита

В частности, это покажет, что вы можете использовать parse() отлично подходит для грамматик, которые используют шкиперы внутри, потому что

ok = phrase_parse(f, l, grammar, skipper, attr);

примерно эквивалентен "умной" грамматике, которая определяет ее внутренне:

ok = parse(f, l, qi::skip(skipper)[grammar], attr);

На самом деле я бы сказал, что в 99% случаев это правильный подход, так как шкипер обычно является свойством синтаксического анализатора, который не может / не должен быть изменен. К сожалению, по историческим причинам в примерах документации часто используется phrase_parse


BONUS

Для некоторых примеров синтаксического анализа команд:

...