Prueba de analizadores Parsec generando entradas con QuickCheck

Me gustaría escribir pruebas para un conjunto de analizadores Parsec. Aquí hay un ejemplo simple de un analizador que quiero probar con QuickCheck:

identifier = do
  c <- letter
  cs <- many (alphaNum <|> oneOf identSymbols)
  skipSpaces
  return $ Ident $ c:cs

Entonces, idealmente, me gustaría que QuickCheck genere identificadores válidos y me asegure de obtener los resultados correctos, además de generar identificadores no válidos y asegurarme de que regresen ParseError. ¿Hay alguna utilidad que facilite este tipo de cosas? ¿Hay alguna forma en que pueda "ejecutar mi analizador a la inversa", por así decirlo, para generar tales entradas?

En general, ¿cómo sería un buen conjunto de pruebas QuickCheck para este analizador? Hasta cierto punto, parece que básicamente tendría que duplicar la lógica del analizador en QuickCheck para lograr una prueba exhaustiva. ¿Es realmente una buena idea, o quizás esta sea una situación en la que una herramienta más tradicional como HUnit es más adecuada que QuickCheck?

preguntado el 12 de junio de 12 a las 17:06

1 Respuestas

En general, el reverso de un analizador es una bonita impresora, y el reverso de una entrada aleatoria a un analizador, es una bonita impresión aleatoria de un AST.

Entonces, sigue el enfoque habitual y defina una instancia arbitraria para su AST, que impulsa fragmentos de sintaxis aleatorios bien formados. Mezcle algunos caracteres erróneos como un envoltorio para probar el manejo de errores.

Ver también:

Respondido el 12 de junio de 12 a las 17:06

Una propiedad particular que me gusta usar es que parse = parse . bonito . analizar gramaticalmente. Esto sirve como una forma decente de modelar el cociente de la información por parte del analizador, hay un buen complemento para conducirlo desde una perspectiva teórica, y captura el hecho de que bastante. parse es idempotente, si no la función de identidad. (Por lo general, el análisis descarta algo de información) - edward kmett

los ultimos dos enlaces estan caidos - alex hirzel

@AlexHirzel ¡Arreglado! (aprobación pendiente) - EmmanuelMess

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.