Python pyparsing,Each,结果名称

Python pyparsing,Each,结果名称,python,sql,pyparsing,Python,Sql,Pyparsing,我正在尝试使用pyparsing来构建一个不太完善的sql解析器(我没有from子句,也没有任何连接,等等)。我今天的工作是基于pyparsing中包含的simpleSQL.py示例脚本。我试图将“GROUPBY”和“ORDERBY”子句添加到解析器中,但无论哪一个出现在另一个之前,都要尝试匹配它们 我使用的是Each类,它似乎与它们匹配,但它没有在Each类中设置结果名称。我不是做得不对,就是发生了一些我不清楚的事情 同样,在simpleSQL.py示例中,我删除了fromToken,因此我的

我正在尝试使用pyparsing来构建一个不太完善的sql解析器(我没有from子句,也没有任何连接,等等)。我今天的工作是基于pyparsing中包含的simpleSQL.py示例脚本。我试图将“GROUPBY”和“ORDERBY”子句添加到解析器中,但无论哪一个出现在另一个之前,都要尝试匹配它们

我使用的是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') ] ) )
因此,它看起来像是在按任意顺序解析group和order子句,但没有将结果名称(分配给“order”和“group”)。我可以看到这是完全愚蠢的,我遗漏了一些东西,或者我可以看到我正在寻找那些以任何顺序排列的条款(以及将来更多的条款,如限制)完全错误

任何帮助都将不胜感激!到目前为止,我一直很喜欢这部电影。

试一试:

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

保罗·麦奎尔,你是个伟人这是寻找不符合顺序的条款的最佳方法吗?非常感谢,pyparsing为我节省了大量的时间和悲伤。(仍然有点不确定为什么您的解决方案与原来的问题不同-但谁在乎,它是有效的!)
Stmt      << ( selectToken +
                columnNameList('columns') + 
                Optional( CaselessKeyword('where') + whereExpression('where'), "" ) +
                Each( [ Optional( CaselessKeyword('group by') + columnNameList('group'), "" ).setDebug(),
                        Optional( CaselessKeyword('order by') + columnNameList('order'), "" ).setDebug() ] 
                    ) 
            )