pyparsing, cada uno, nombre de resultados

Estoy tratando de usar pyparsing para crear un pequeño analizador que no sea bastante simple (no tengo cláusulas, no tengo ninguna combinación, etc.). Hoy he basado mi trabajo en el script de ejemplo simpleSQL.py incluido con pyparsing. Estoy tratando de agregar las cláusulas “GRUPO POR” y “ORDENAR POR” en el analizador, pero trato de hacerlas coincidir sin importar cuál venga antes que el otro.

Estoy usando la clase Cada, y parece que está coincidiendo con ellos, pero no establece el nombre del resultado dentro de la clase Cada. O no estoy haciendo algo bien, o algo está pasando, no lo tengo claro.

Nuevamente, del ejemplo simpleSQL.py, eliminé fromToken, por lo que mi selectStmt ahora se ve así:

# 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') ] ) ) 

Me sale el resultado:

 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']] 

Entonces, parece que está analizando el grupo y las cláusulas de orden en cualquier orden, pero no asigna el nombre de los resultados (a “orden” y “grupo”). Puedo ver que esto es completamente tonto y me estoy perdiendo algo, o puedo ver que estoy tratando de encontrar esas cláusulas en cualquier orden (y más cláusulas en el futuro, como LIMIT) completamente equivocadas.

Cualquier ayuda sería muy apreciada! Amando pyparsing hasta ahora.

Dale una oportunidad a esto:

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