Я пишу приложение CLI в python с использованием довольно сложного языка командной строки. Идея очень похожа на находку (1), которая, возможно, имеет такое же свойство.Python: команда синтаксического анализа
В настоящее время синтаксический анализатор полностью рукописный, используя ручной язык описания EBNF. Проблема в том, что этот язык очень неудобен для использования, потому что я должен писать все как структуры python. Я также чувствую, что моя программа все еще слишком раздута из-за разбора.
Есть ли lib, который отличается простотой использования и истинным языком описания (ввод как строка/документ) для синтаксического анализа командной строки? Из дерева синтаксиса я хотел бы непосредственно сопоставить каждый элемент с экземпляром класса. Естественно, я не хочу токенизатор, или, по крайней мере, токенизатор должен отображаться прямо из аргументов командной строки в токены.
Спасибо за все предложения!
UPDATE: Весь смысл моей программы для создания объектов и передавать их через любое количество фильтров (возможно, недостаточные чистоту/effectful действий), которые могут включать или не выводить объекты снова, или даже может выводить объекты других тип. Общая идея, очевидно, почерпнута из find (1). Пример командной строки:
~/picdb.py -sqlselect 'select * from pics where dirname like "testdir%"' -tagged JoSo -updateFromFile [ -resx +300 -or -resX +200 -resY +500 ] -printfXml '<jpegfile><src>%fp</src><DateTimeOriginal>%ed</DateTimeOriginal><Manufacturer>%eM</Manufacturer><Model>%em</Model></jpegfile>%NL'
Может ли [argparse] (http://docs.python.org/library/argparse.html#module-argparse) (python 2.7+) удовлетворить ваши потребности? – Aufwind
В дополнение к комментарию @Aufwind - вам не нужно * иметь python 2.7 или новее для пользователя argparse. Он отлично работает со старыми версиями python - вам просто нужно установить, если вы сами (в отличие от того, чтобы быть включенным в стандартную библиотеку). – mgilson
Я думаю, что если бы вы описали свою командную строку (или, по крайней мере, дали пример или два), мы могли бы увидеть, является ли это кандидатом для argparse/optparse ... – mgilson