Для грамматик средней сложности PyParsing великолепен. Вы можете определять грамматики непосредственно в коде Python, нет необходимости в генерации кода:
>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']
(Пример взят с домашней страницы PyParsing).
С помощью действий синтаксического анализа (функций, которые вызываются при срабатывании определенного правила грамматики), вы можете конвертировать синтаксические анализаторы непосредственно в деревья абстрактного синтаксиса или любое другое представление.
Существует много вспомогательных функций, которые инкапсулируют повторяющиеся шаблоны, такие как иерархии операторов, строки в кавычках, вложения или комментарии в стиле C.