Это были несколько лет начиная с моего класса языка программирования и таким образом, я забыл тонкости BNF's и EBNF's, и у меня нет учебника рядом со мной. А именно, я забыл, как преобразовать EBNF в BNF.
Из того, что мало я помню, я знаю, что один из основных моментов должен преобразовать { term }
в <term> | <many-terms>
. Но я не помню других правил. Я попытался искать это онлайн, но я могу только найти ссылки или на вопросы о домашней работе или на маленький комментарий о преобразовании условий с фигурными скобками. Я не могу найти исчерпывающий список правил, которые определяют перевод.
См. Следующую ссылку, она содержит инструкции для каждого продукта, который необходимо преобразовать:
http://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3. html
Для построения синтаксических анализаторов (особенно восходящих) грамматика BNF часто бывает лучше, чем EBNF. Но легко преобразовать грамматику EBNF в BNF:
Преобразуйте каждое повторение
{E}
в новый нетерминальныйX
и добавьтеX = ε | X E.
Преобразуйте каждый параметр
[E]
в новый нетерминальныйX
и добавьтеX = ε | E.
(Мы можем преобразовать
X = A [E] B.
вX = AEB | A B.
)Преобразовать каждую группу
(E)
в новый нетерминальныйX
и добавитьX = E.
Мы даже можем избавиться от альтернатив, создав несколько производств с такой же нетерминальный.
X = E | E '.
становитсяX = E. X = E '.