JavaCUP - Opciones de personalización
Opciones de Personalización
Cuando se define la especificación del lenguaje para el que se desea construir el parser, el comportamiento de CUP puede modificarse mediante algunas opciones de personalización que se documentan en Main.java, y se presentan el la siguiente tabla; también existe un conjunto de métodos disponibles para la personalización del parser.
opción | efecto |
-package name | Especifica que las clases parser y sym son ubicadas en el package cuya identificación es name. Por defecto, ninguna especificación de package se incluye en el código generado, es decir en las clases creadas por defecto para el package especial "unnamed". |
-parser name | Como resultado almacena el parser y el código de acción en un archivo identificado por name, en lugar del archivo por defecto. |
-symbols name | Como resultado almacena el código de los símbolos constantes en una clase con identificador name, en lugar de la clase por defecto "sym". |
-interface | Como salida, el código de los símbolos constantes se presenta como una
interface más que como una class . |
-nonterms | Ubica las constantes de los no terminales en la clase de símbolos constantes. El parser, no necesita de estos símbolos constantes, por lo que normalmente no son visibles. Sin embargo, pueden ser muy útiles a la hora de efectuar un debugging del parser generado. |
-expect number | Durante la construcción del parser, el sistema puede detectar que en tiempo de ejecución podría ocurrir alguna situación ambigua, es decir que puede presentarse un conflicto. En general, el parser puede ser incapaz de decidir si realizar shift (leer el símbolo siguiente) o reduce (reemplazar la expansión de producción reconocida por el lado izquierdo de dicha producción). A estos conflictos se los denomina conflicto shift/reduce. Similarmente, el parser puede hallarse ante un conflicto reduce/reduce, es decir que no es capaz de decidir entre reducciones con dos o más producciones diferentes. Normalmente, si uno o más de estos conflictos ocurren, la generación del parser es abortada. Sin embargo, en ciertos casos considerados muy cuidadosamente, puede ser ventajoso interrumpir arbitrariamente tales conflictos. En esos casos, CUP resuelve los conflictos shift/reduce, optando por el shift, y los conflictos reduce/reduce, usando la producción de mayor prioridad, es decir, la primera que se halla declarado en la especificación. Para habilitar la interrupción de los conflictos, la opción -expect debe darse explicitando cómo se esperan los conflictos. Los conflictos resueltos por precedencias y asociatividades no son reportados. |
-compact_red | La inclusión de esta opción habilita una tabla de optimización que maneja las reducciones. En particular, esto permite utilizar la entrada reduce más común de cada fila de la tabla de acciones del parser, como la acción por defecto para toda la fila. Típicamente, esto ahorra espacio considerable en las tablas, las que pueden llegar a crecer desmesuradamente. Esta optimización tiene el efecto de reemplazar todas las entradas erróneas en una fila con la entrada reduce por defecto. Algunos cambios de este tipo, son inherentes en los parsers LALR, cuando se los compara con los LR canónicos, y los parsers resultantes nunca leerán pasado el primer token, donde el error podría ser detectado. Sin embargo, el parser puede realizar reducciones extras que serán erróneas, antes de detectar el error, lo cual puede degradar la habilidad del parser para ejecutar la recuperación de errores. Esta opción, típicamente es usada para trabajar con las limitaciones de java bytecode en el tamaño del código de inicialización de la tabla. Sin embargo, CUP 0.10h introduce un string de codificación para las tablas del parser las que no están sujetas a las limitaciones del tamaño del método standard. Consecuentemente, esta opción no debería ser requerida para gramátcas grandes. |
-nowarn | Esta opción hace que todos los mensajes de warning procucidos por el sistema sean suprimidos. |
-nosummary | Normalmente, al finalizar su ejecución, el sistema imprime una lista resumiendo datos tales como el número de terminales, no terminales, estados de parsing, etc. La opción nosummary inhibe la creación de dicho sumario. |
-progress | Esta opción provoca que el sistema imprima pequeños mensajes que indiquen el progreso a través de varios puntos durante el proceso de generación del parser. |
|
Estas opciones causan, respectivamente, que el sistema produzca un informe capaz de ser leído por un humano, acerca de la gramática, los estados costruídos (a menudo necesarios para resolver conflictos de parsing) y las tablas de parsing (raramente usadas). La opción -dump, incluye a todas las demás. |
-time | Esta opción agrega al sumario normal de resultados, detalles de estadísticas temporales. Normalmente, esta opción sólo es de interés para quienes mantienen el sistema. |
-debug | Esta opción produce voluminosa información interna acerca del debugging del sistema a medida que se ejecuta.Normalmente, esta opción sólo es de interés para quienes mantienen el sistema. |
-nopositions | Esta opción evita que CUP genere código para propagar los valores a izquierda y a derecha de los terminales a no terminales, y luego de no terminales a otros terminales. Si los valores left y right no son usados por el parser, se guardarán algunos cálculos de tiempo de ejecución para no generar estas posiciones de propagación. Esta opción también evita que se generen las etiquetas de las variables left y right, y así cualquier referencia a ellas causará error. |
-noscanner | CUP 0.10j introduce mejoras de integración de scanner y una nueva interface, java_cup.runtime.Scanner . Por defecto, el parser generado se refiere a esta interface, lo que significa que el usuario no puede usar el parser con versiones de CUP anteriores a la 0.10j. Si el parser no usa las nuevas características de integración de scanner, puede especificarse la opción -noscanner para suprimir la referencia a java_cup.runtime.Scanner y permitir la compatibilidad con versiones antiguas. |
-version | La invocación de CUP con el flag -version tiene como resultado la impresión de la versión de CUP y que el sistema pare su ejecución. Esto permite a versiones automáticas de chequeo para Makefiles, instalar scripts y otras aplicaciones que puede requerir. |