Pregunta

He estado ayudando a aumentar un lenguaje propietario de veinte años dentro de mi empresa. Es un lenguaje grande, completo de Turing. Traducirlo a otro régimen gramatical (como Antlr) no es una opción (no puedo decidir esto).

En su mayor parte, la extensión de la gramática se ha realizado sin problemas. Pero de vez en cuando obtendré una reducción-reducción o cambio-reducción que

  • es difícil de eliminar
  • a veces simplemente no tiene sentido (para mi débil cerebro)

Después de mirar dolorosamente los archivos y.output y las refactorizaciones gramaticales experimentales, generalmente llegué a donde quería ir. A veces he tenido que hacer compromisos insatisfactorios.

Entonces, ¿hay alguna herramienta que pueda absorber una gramática yacc, que mejore la exploración, la experimentación y permita la depuración de los cambios?

Si agrego una producción, me gustaría ver más de "producción atómica que se usa en todas partes". (pensar en el identificador) '' entra en conflicto con la regla foo '' (sí, hay más información, s / r, r / r, que eso, pero creo que me entiendes). Sería bueno tener alguna pista de la interacción más allá de ponerme mi gorra de pensamiento e intentar imaginar una pila de símbolos y una máquina de estados.

Actualización: supongo que debería aclararlo. Usamos Berkeley Yacc. He estado probando usando una versión reciente de Bison. Para la salida, he compilado la gramática con --report = itemset .

Mi objetivo con esta publicación es buscar herramientas externas que aumenten las funciones de depuración gramatical que se envían con yacc. Hoy es doloroso con el conjunto predeterminado. Ayúdame a encontrar mejores herramientas interactivas, como las que puedes usar con Antlr.

¿Fue útil?

Solución

Usted podría obtener ayuda de yacc -d , que produce una salida de depuración; básicamente proporciona una lista completa de los estados de la pila de símbolos y demás. El resultado es denso y voluminoso, por lo que tratar de leerlo todo directamente rara vez logra mucho (de todos modos, nunca lo ha hecho). Sin embargo, cuando realiza un cambio en el dado (por ejemplo) un conflicto r / r, puede ejecutar yacc -d en la gramática anterior y en la nueva, luego ejecutar diff en los resultados, para obtener un desglose mucho más detallado de los cambios que causaron el conflicto.

Probablemente valga la pena señalar, sin embargo, que los conflictos s / r a menudo son benignos, a menos que esté bastante seguro de que es un problema, tratando de "arreglar". a menudo no vale la pena. Sin embargo, lo mismo no es cierto con los conflictos r / r. Si bien estos son a veces benignos, es relativamente raro.

Editar: Vaya, lo siento, eso debería ser -v. Usted menciona su salida, por lo que aparentemente ya sabe cómo hacer esa parte. El punto es que no intentas mirar los archivos de salida y. directamente, sino hacer una diferencia entre el que salió limpiamente y el que no lo hizo para obtener algunos detalles sobre el conflicto real (sin mirar 10 millones de líneas de "cosas" que está bien.

Otros consejos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top