2012-06-12 21 views
7

Me gustaría escribir pruebas para un conjunto de analizadores Parsec. Aquí está un ejemplo simple de un analizador quiero probar con QuickCheck:Prueba de analizadores Parsec generando entradas con QuickCheck

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

Así, idealmente, me gustaría QuickCheck para generar identificadores válidos y asegúrese de que tenga los resultados Derecha, así como la generación de identificadores no válidos y asegurándose de que devuelvan ParseError. ¿Hay utilidades que facilitarían este tipo de cosas? ¿Hay alguna manera en que pueda "ejecutar mi analizador en reversa", por así decirlo, para generar tales entradas?

En general, ¿cómo sería un buen conjunto de pruebas de 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 una situación en la que una herramienta más tradicional como HUnit es más adecuada que QuickCheck?

Respuesta

13

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

Por lo tanto, siga el usual approach y defina una instancia arbitraria para su AST, que maneja fragmentos de sintaxis bien formados al azar. Mezcle algunos caracteres erróneos como un contenedor para probar el manejo de errores.

Consulte también:

+0

Una propiedad particular que me gusta usar es que parse = analizar. bonita . analizar gramaticalmente. Esto sirve como una forma decente de modelar la asignación de información por parte del analizador sintáctico, hay una buena adición para conducirlo desde una perspectiva teórica, y captura el hecho de que es bonito. el análisis es idempotente, si no la función de identidad. (Por lo general, el análisis descarta cierta información) –

+2

últimos dos enlaces están muertos –

Cuestiones relacionadas