![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Parsing Expression GrammarBoost , Spirit 2.5.2 , Abstracts
|
![]() |
Note |
---|---|
В Spirit.Qi мы используем |
Альтернативы представлены в PEG с использованием слэша:
a / b
![]() |
Note |
---|---|
В Spirit.Qi и Spirit.Karma мы используем |
Альтернативы позволяют делать выбор. Выражение выше гласит: попробуйте сопоставить a
. Если a
удаётся, успех, если не пытаться сопоставить b
. Это немного отклонение от обычной интерпретации EBNF, где вы просто соответствуете a
или b
. Вот синтаксическая диаграмма:
ПЭГ допускают двусмысленность альтернатив. В приведенном выше выражении оба a
или b
могут совпадать с входной строкой. Однако действительна только первая подходящая альтернатива. Как уже отмечалось, существует только одно действующее дерево.
Опять же, как и EBNF, PEG использует звезду Kleene с регулярным выражением и петли плюс:
a* a+
![]() |
Note |
---|---|
Spirit.Qi и Spirit.Karma используют префикс звезды и плюс, поскольку в C++ нет постфиксной звезды или плюса. |
Вот синтаксические диаграммы:
Первая, называемая звездой Клин, соответствует нулю или больше ее объекта a
. Вторая, плюс, соответствует одной руде больше ее предмета a
.
В отличие от EBNF, PEG имеют жадные петли. Он будет соответствовать как можно больше до тех пор, пока его субъект не будет соответствовать без учета того, что следует. Ниже приводится классический пример довольно распространенного выражения EBNF/regex, не соответствующего PEG:
alnum* digit
В PEG число будет съедать столько буквенно-цифровых символов, сколько оно не сможет оставить позади. Таким образом, следующая цифра ничего не получит. Петли просто реализуются в рекурсивном коде спуска, что делает их чрезвычайно эффективными. Это явное преимущество. С другой стороны, те, кто знаком с EBNF и поведением регекса, могут найти это поведение основным. PEG предоставляет несколько других механизмов, чтобы обойти это. В ближайшее время мы увидим больше подобных механизмов.
В некоторых случаях вы можете ограничить определенное выражение. Вы можете думать о выражении PEG как о совпадении с потенциально бесконечным набором строк. Разница оператора позволяет ограничить этот набор:
a - b
Выражение гласит: «соответствовать a
, но не b
».
![]() |
Note |
---|---|
Нет разницы оператора в Spirit.Karma, так как концепция не имеет смысла в контексте генерации выходных данных. |
[6] Брайан Форд: Грамматика парсинга: основанный на признании синтаксический фонд, http://pdos.csail.mit.edu/~baford/packrat/popl04/
[7] Ричард Е. Паттис: EBNF: A Notation to Describe Syntax, http://www.cs.cmu.edu/~pattis/misc/ebnf.pdf
Статья Parsing Expression Grammar раздела Spirit 2.5.2 Abstracts может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |