2009-10-28 15 views
10

He estado ayudando a aumentar un lenguaje propietario de veintitantos años dentro de mi empresa. Es un gran lenguaje completo de Turing. Traducirlo a otro régimen gramatical (como Antlr) no es una opción (no puedo decidir esto).¿Hay depuradores gramaticales Yacc?

En su mayor parte, la extensión de la gramática ha ido sin problemas. Pero de vez en cuando voy a conseguir una reducción-reducción o reducción por desplazamiento que

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

Después de un montón de mirar fijamente a y.output archivos y refactorizaciones gramaticales experimentales, usualmente llegué a donde quería ir. A veces he tenido que hacer compromisos insatisfactorios.

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

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

Actualización: supongo que debería aclarar. 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 este post es buscar a externos instrumentos que Aumentados las instalaciones de depuración de la gramática que vienen listas con yacc. Hoy es doloroso con el conjunto predeterminado. Ayúdame a encontrar mejores herramientas interactivas, como las que puedes usar con Antlr.

Respuesta

7

Usted podría obtener alguna ayuda de yacc -d, que produce la salida de depuración - que básicamente se da una lista completa de los estados símbolo de pila y tal. El resultado es denso y voluminoso, por lo que tratar de leer todo directamente raramente logra mucho (nunca lo ha hecho de todos modos). Sin embargo, cuando realiza un cambio, le da (por ejemplo) un conflicto r/r, puede ejecutar yacc -d en la gramática antigua y la nueva, luego ejecutar diff en los resultados, para obtener un desglose mucho más detallado de lo que cambio (s) causó el conflicto.

Sin embargo, vale la pena señalar que los conflictos s/r a menudo son benignos; a menos que esté seguro de que es un problema, tratar de "corregirlo" a menudo no vale la pena. Lo mismo no es cierto con los conflictos r/r. Si bien estos son a veces benignos, es comparativamente raro.

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

+0

No estoy seguro de lo que quieres decir. Con nuestros dos yaccs, -d significa "generar un archivo de encabezado para las macros de token". Acabo de agregar más información sobre el uso del interruptor --report = itemset. ¿Es este el tipo de cosa que quieres decir? Genera un archivo, y.output lleno de toda la información de transición de estado. Lo estoy usando, pero esperaba una herramienta más poderosa e interactiva. –

+1

Jerry tiene razón, los conflictos S/R no son necesariamente errores. Casi todas las gramatías reales tienen un montón de ellas. – DigitalRoss

Cuestiones relacionadas