Estoy escribiendo un analizador para un lenguaje de consulta utilizando PyParsing, y me he quedado atrapado (lo que creo que es) un problema con lookaheads. Un tipo de cláusula en la consulta tiene por objeto dividir cadenas en 3 partes (nombre de campo, operador, valor) de manera que nombre de campo es una palabra, operador es una o más palabras y valor es una palabra, una cadena entre comillas o una lista entre paréntesis de estas.PyParsing lookaheads y expresiones codiciosas
Mis datos parecen
author is william
author is 'william shakespeare'
author is not shakespeare
author is in (william,'the bard',shakespeare)
Y mi actual del analizador de esta cláusula se escribe como:
fieldname = Word(alphas)
operator = OneOrMore(Word(alphas))
single_value = Word(alphas)^QuotedString(quoteChar="'")
list_value = Literal("(") + Group(delimitedList(single_value)) + Literal(")")
value = single_value^list_value
clause = fieldname + originalTextFor(operator) + value
Obviamente esto no funciona debido al hecho de que el elemento operator
es codicioso y devorará hasta el value
si puede. Después de leer otras preguntas similares y los documentos, he llegado a la conclusión de que tengo que gestionar esa anticipación con un NotAny
o FollowedBy
, pero no he podido encontrar la manera de hacerlo funcionar.
No se pudo que acaba de hacer una lista explícita de posibilidades para los operadores? –
@KarlKnechtel Desafortunadamente, la lista de operadores será extensible. Supongo que podría compilar esa lista en tiempo de ejecución y construir la gramática de forma dinámica, pero parece que sería más limpio poder hacer que el analizador sintiera la agnóstico. Sin embargo, ese es un buen plan de respaldo, en caso de que no pueda resolverlo, así que gracias. –