Конвертировать грамматику EBNF в PEG

Я имею грамматику EBNF и хочу преобразовать ее в PEG (https://github.com/anatoo/PHPPEG):

query = { word | wildcard }
word = ( [apostrophe] ( letter { alpha } ) ) | ” , ”
letter = ” a ” | ... | ” z ” | ” A ” | ... | ” Z ”
alpha = letter | ” 0 ” | ... | ” 9 ”
apostrophe = ” ’ ”
wildcard = ” ? ” | ” * ” | synonyms | multiset | optionset
synonyms = ” ~ ” word
multiset = ” { ” word { word } ” } ”
optionset = ” [ ” word { word } ” ] ”

Может кто-нибудь объяснить, как конвертировать из одного в другой, или если есть где-то, где я могу прочитать об этом?

Спасибо!

• the question mark (?), which matches exactly one word;
• the asterisk (*), which matches any sequence of words;
• the tilde sign in front of a word (∼<word>), which matches any of the word’s synonyms;
• the multiset operator ({<words>}), which matches any ordering of the enumerated words; and,
• the optionset operator ([<words>]), which matches any one word from a list of options.

0

Решение

Существует несколько реализаций Peg, и все они добавляют что-то к общим соглашениям, принятым Peg:

  • Операторы «*», «+» и «?» имеют то же значение, что и в обычном
    выражения;
  • Альтернативы на самом деле являются приоритетным выбором, и они используют
    оператор «/» для указания этой разницы;
  • Операторы «&«и»! обозначают положительный и отрицательный прогноз нулевой длины (то есть они не продвигают указатель «current»);

В EBNF повторение представляется как «{}», что в Peg представляется оператором «*», что означает ноль или более повторений субъекта. Например, ваше первое правило грамматики может быть представлено следующим образом в гипотетической реализации Peg:

query = (word / wildcard)*

Оператор EBNF «[]» имеет то же значение, что и оператор Пег «?» оператор, означающий, что предмет необязателен. Вот ваше второе правило, так как оно может быть преобразовано в Peg:

word = (apostrophe?  letter alpha*) / ","

Наконец, несколько реализаций Peg позволяют использовать регулярные выражения непосредственно в их грамматике. Посмотрите, как ваше третье правило может быть представлено в таком Peg:

letter = [a-zA-Z]

В зависимости от используемого вами языка и конкретной реализации Peg, некоторые вещи могут измениться, но я надеюсь, что эти рекомендации укажут вам правильное направление.

1

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

Других решений пока нет …