Я пытаюсь использовать pyparsing для создания небольшого парсера не совсем sql (у меня нет предложений, у меня нет соединений и т. Д.).Сегодня я основываю свою работу на примере скрипта simpleSQL.py, включенного в pyparsing.Я пытаюсь добавить предложения "GROUP BY" и "ORDER BY" в анализатор, но пытаюсь сопоставить их независимо от того, что предшествует другому.
Я использую класс Each, и кажется, что он соответствует им, но он не устанавливает имя результата из каждого класса.Я либо делаю что-то не так, либо происходит что-то, что мне не ясно.
Опять же, из примера simpleSQL.py я удалил fromToken, поэтому мой selectStmt теперь выглядит так:
# define the grammar
selectStmt << ( selectToken +
columnNameList.setResultsName('columns') +
Optional( CaselessKeyword('where') + whereExpression, "" ).setResultsName('where') +
Each( [ Optional( CaselessKeyword('group by') + columnNameList, "" ).setResultsName('group'),
Optional( CaselessKeyword('order by') + columnNameList, "" ).setResultsName('order') ] ) )
Я получаю результат:
SELECT a WHERE a=b and c = d GROUP BY c, e ORDER By d ->
tokens = ['select', ['a'], 'where', ['a', '=', 'b'], 'and', ['c', '=', 'd'], 'group by', ['c', 'e'], 'order by', ['d']]
SELECT a WHERE a=b and c =d ORDER BY z, y GROUP BY c ->
tokens = ['select', ['a'], 'where', ['a', '=', 'b'], 'and', ['c', '=', 'd'], 'order by', ['z', 'y'], 'group by', ['c']]
Таким образом, похоже, что он анализирует предложения group и order в любом порядке, но не присваивает имя результатов («order» и «group»).Я могу видеть, что это совершенно глупо, и я что-то упускаю, или я вижу, что я нахожу эти предложения в любом порядке (и в будущем, например, LIMIT) совершенно неправильными.
Любая помощь будет принята с благодарностью!ЛЮБОВЬ кипятится до сих пор.