То, что вы написали в pyparsing, не очень хорошо переводится на PLY, потому что, это едва ли даже парсер. nestedExpr
- помощник для быстрого определения выражения формы «Я действительно не знаю, что в этом, но он окружен ()
(или {}
или []
или что-то еще), и они могут быть вложенными». Действительно удобно разбирать «{} '-граничный язык, подобный C, для определения простого определения функции как type_spec + identifier + parameter_spec + nestedExpr('{', '}')
. Учитывая, что вы определяете свой контент для включения '&' и '|' операторы, похоже, что вы действительно хотите разобрать логическое выражение, включая поддержку скобки, чтобы переопределить приоритет операций.
Пример simpleBool.py на странице примеров вики-файлов pyparsing показывает некоторые тестовые примеры и выражения для поддержки синтаксического анализа булевых выражений. BUT он по-прежнему использует вспомогательный метод, infixNotation
, который скрывает большую часть шагов определения парсера, поэтому снова будет трудно перевести на PLY напрямую. Однако я ссылаюсь на этот пример, потому что это может помочь вам прояснить, что именно нужно для разбора булевых выражений (включая разбор булевых литералов типа «True», «False» и т. Д. И, возможно, добавление поддержки оператора «not»). Кроме того, это даст вам кучу бесплатных тестовых примеров - помогите себе!
Чтобы увидеть более явную грамматику, которая сродни тому, что ожидает PLY, посмотрите на пример fourFn.py pyparsing. Он предшествует помощнику infixNotation
, поэтому он явно создает различные приоритеты операций. (Изящество этой формы реализации приоритета арифметического оператора в значительной степени заинтересовало меня в анализе приложений в первую очередь.)