Называть файлы грамматики «BNF» немного вводит в заблуждение, поскольку они на самом деле являются модифицированным форматом PEG (грамматика синтаксического анализа выражения), который допускает некоторые расширенные операторы, включая группирование, повторение и необязательность, и упорядоченный выбор (который семантически отличается от обычное определение |
).
Поскольку в основе лежит технология PEG, вы не можете использовать леворекурсивные правила. Левая рекурсия вызовет бесконечный цикл в синтаксическом анализаторе, если генератор кода не откажется генерировать левый рекурсивный код. К счастью, операторы повторения доступны, поэтому вам нужна только рекурсия для синтаксиса с круглыми скобками, и это не левая рекурсия, поэтому она не представляет никаких проблем.
Насколько я вижу из документации, которую я нашел, набор грамматики не предусматривает объявления приоритетов операторов. Если вам действительно нужно произвести правильный анализ с учетом приоритета оператора, вам нужно использовать несколько уровней приоритета. Однако, если ваш единственный вариант использования - подсветка синтаксиса, вам, вероятно, не требуется точно точный анализ, и было бы достаточно сделать что-то вроде следующего:
expr ::= unary (('+' | '-' | '*' | '/') unary)*
unary ::= '-'* ( '(' expr ')' | literal )
(Для точного разбора вам нужно разделить expr
выше на два уровня приоритета, один для аддитивных операторов и другой для мультипликативного. Но я не советую этого делать, если вы не собираетесь использовать синтаксический анализ для оценки или кодирования. поколение.) * * 1 010
Кроме того, вам почти наверняка потребуется какое-то лексическое правило для распознавания различных символов оператора и возврата соответствующих односимвольных токенов.