pyparsing, Each, имя результата - PullRequest
2 голосов
/ 22 июля 2011

Я пытаюсь использовать 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) совершенно неправильными.

Любая помощь будет принята с благодарностью!ЛЮБОВЬ кипятится до сих пор.

1 Ответ

1 голос
/ 23 июля 2011

Дайте этому шанс:

Stmt      << ( selectToken +
                columnNameList('columns') + 
                Optional( CaselessKeyword('where') + whereExpression('where'), "" ) +
                Each( [ Optional( CaselessKeyword('group by') + columnNameList('group'), "" ).setDebug(),
                        Optional( CaselessKeyword('order by') + columnNameList('order'), "" ).setDebug() ] 
                    ) 
            )
...