¿Es posible? ¿Alguna herramienta disponible para esto?Generando expresiones aleatorias pero aún válidas basadas en la gramática yacc/bison/ANTLR
Respuesta
yacc y bison convierten su gramática en una máquina de estados finitos. Debería poder atravesar la máquina de estados aleatoriamente para encontrar entradas válidas.
Básicamente, en cada estado puede cambiar un token nuevo a la pila y pasar a un nuevo estado o reducir el token superior en la pila en función de un conjunto de reducciones válidas. (Consulte el Bison manual para obtener detalles sobre cómo funciona esto).
Su generador aleatorio atravesará la máquina de estados realizando cambios o reducciones al azar pero válidos en cada estado. Una vez que alcanzas el estado terminal, tienes una entrada válida.
Para una descripción legible por humanos de los estados, puede usar la opción -v
o --report=state
para bisontar.
Me temo que no puedo indicarle ninguna herramienta existente que pueda hacer esto.
Puede hacerlo con cualquier sistema que le dé acceso a la gramática base. ANTLR y YACC recopilan tu gramática para que no la tengas más. En el caso de ANTLR, la gramática se convirtió en código; no vas a recuperarlo. En el caso de YACC, terminas con tablas de analizador, que contienen la esencia de la gramática; Podrías recorrer esas tablas sintácticas si las entendías lo suficientemente bien como para hacer lo que describo a continuación como.
Es bastante fácil atravesar un conjunto de reglas gramaticales explícitamente representadas y elegir al azar expansiones/derivaciones. Por definición, esto le dará una sintaxis válida.
Lo que no hará es que te valide código. El problema aquí es que la mayoría de los lenguajes realmente tienen sintaxis sensible al contexto; la mayoría de los programas no son válidos, a menos que los identificadores declarados se utilicen de forma coherente con sus reglas de declaración y alcance. Esto último requiere un control semántico completo.
Nuestro DMS Software Reengineering Toolkit se usa para analizar código en lenguajes arbitrarios [usando una gramática], crear AST, permite analizar y transformar esos árboles, y finalmente imprimir bastante el texto válido (sintáctico). DMS proporciona acceso directo a las reglas de gramática y las instalaciones de construcción de árboles, por lo que es bastante fácil generar árboles sintácticos aleatorios (y copias bonitas). Asegurarse de que sean semánticamente válidos también es difícil con DMS; sin embargo, muchos de los frontales de DMS pueden tomar un árbol (aleatorio) y hacer una comprobación semántica, por lo que al menos sabría si el árbol era semánticamente válido.
Lo que debe hacer si dice "no" sigue siendo un problema. Quizás pueda generar nombres de identificadores de manera que garanticen un uso al menos no inconsistente, pero sospecho que dependería del idioma.
Sí, los nombres son una pregunta siguiente ... Necesito generar AST aleatorios hasta el primer paso. –
- 1. Generando palabras aleatorias en Java?
- 2. Secret Santa - Generando permutaciones "válidas"
- 3. Generando miniaturas aleatorias con PHP + FFMPEG
- 4. expresiones válidas para la función cotización
- 5. Generando oraciones aleatorias de texto personalizado en Python's NLTK?
- 6. Gramática de expresiones aritméticas y Analizador
- 7. ¿Es posible tener expresiones regulares que coincidan con todas las expresiones regulares válidas?
- 8. Gramática sin contexto que describe expresiones regulares?
- 9. Java: ¿Buscar en claves HashMap basadas en expresiones regulares?
- 10. Regexp que coincide con las expresiones regulares válidas
- 11. biblioteca estática, pero aún necesito encabezados?
- 12. advertencia mcrypt pero aún descifra los datos
- 13. Cómo hacer IvParameterSpec aleatorio pero aún descifrar
- 14. ¿Qué herramientas de analizador sintáctico basadas en gramática existen para ruby?
- 15. Hacer que la preferencia parezca deshabilitada, pero aún registrar clics
- 16. ¿Cómo es esta gramática LR (1) pero no SLR (1)?
- 17. PHP: Determine las imágenes corruptas visualmente (aún válidas) descargadas a través de Curl con GD/Imagemagick
- 18. Gramática Lisp en yacc
- 19. PHP generando páginas, pero no devolviéndolas al usuario de inmediato
- 20. La tabla IE9 tiene filas aleatorias que están desplazadas en columnas aleatorias
- 21. generando un MouseEvent en JavaFX
- 22. Python: "TypeError: __str__ devolvió la cadena" pero aún se imprime en la salida?
- 23. Ignorar DOCTYPE .dtd, pero el archivo .dtd aún debe existir
- 24. Cómo obtener gcc para omitir errores, pero aún así generarlos.
- 25. archivo sqlite3 agregar en .gitignore pero aún está en la lista modificada?
- 26. JSF EL: ¿instancia de reserva pero aún no implementada?
- 27. generar enumeraciones aleatorias
- 28. Redes físicas basadas en turnos basadas en varios jugadores
- 29. Variables gaussianas aleatorias
- 30. ¿Las comparaciones entre InnoDB y MyISAM aún son válidas en términos de velocidad de lectura frente a escritura?
no ha recibido su pregunta, ¿está pidiendo este http://flex.sourceforge.net/ si no, entonces elabore –
No, no sobre flexión. Ya sabes, yacc/bison/ANTLR analiza * expresiones * usando * gramática * específica. Necesito generar expresiones * aleatorias * válidas para * gramática * especificada. Por ejemplo, usando la gramática de la calculadora, me gustaría tener una herramienta para producir expresiones como "1 + 2 + 3", "1 + 4 * 8", etc., de forma infinita y aleatoria. –
@ nav-jan: ¿por qué debería ser fácil? Las afirmaciones sin respaldo no son realmente útiles. (Bueno, un lenguaje de calculadora numérica podría ser fácil). –