2

私は pyparsing を使用して、まったくSQLではないパーサーを構築しようとしています(from句がなく、結合などもありません)。今日の作業は、pyparsing に含まれている simpleSQL.py サンプル スクリプトに基づいています。「GROUP BY」句と「ORDER BY」句をパーサーに追加しようとしていますが、どちらが先に来てもそれらを一致させようとしています。

Each クラスを使用していますが、一致しているように見えますが、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 などの将来の節も) 完全に間違っています。

どんな助けでも大歓迎です!これまでのパイパースが大好きです。

4

1 に答える 1

1

これを試してみてください:

Stmt      << ( selectToken +
                columnNameList('columns') + 
                Optional( CaselessKeyword('where') + whereExpression('where'), "" ) +
                Each( [ Optional( CaselessKeyword('group by') + columnNameList('group'), "" ).setDebug(),
                        Optional( CaselessKeyword('order by') + columnNameList('order'), "" ).setDebug() ] 
                    ) 
            )
于 2011-07-22T22:32:17.937 に答える