JavaCC - JJTree: Opciones de personalización
Opciones de Personalización para JJTree
JJTree soporta varias opciones en la línea de comandos y en las sentencias
de opciones de JavaCC, y se enumeran a continuación:
Opción | Efecto |
BUILD_NODE_FILES |
Genera implementaciones por defecto para SimpleNode y para cualquier otro
nodo usado en la gramática. Valor por defecto: true. |
MULTI |
Genera un árbol de parsing en modo multi. El valor por defecto es falso,
de tal modo que se genera un árbol de parsing en modo simple. Valor por defecto: false. |
NODE_DEFAULT_VOID |
En lugar de hacer cada producción no decorada un nodo indefinido, las hace
void. Valor por defecto: false. |
NODE_FACTORY |
Para construir nodos debe usarse un método factory con la siguiente signatura:
|
NODE_PACKAGE |
El package genera las clases nodo. El valor por defecto es el package del
parser. Valor por defecto:" ". |
NODE_PREFIX |
El prefijo usad para construir los nombres de las clases nodo a partir
de los identificadores en modo multi. El valor por defecto es AST. Valor por defecto: "AST". |
NODE_SCOPE_HOOK |
Inserta llamadas a métodos de parser definidos por el usuario al comienzo
y al final del alcance de cada nodo. (Ver Node Scope Hooks más abajo.) Valor por defecto:false. |
NODE_USES_PARSER |
JJTree usará una forma alternativa de rutinas de construcción de nodos
en las que se pasa el objeto parser incluído. Por ejemplo,
|
STATIC |
Genera código para un parser estático. El valor por defecto es verdadero.
Debe ser usado consistentemente con las opciones de JavaCC equivalentes.
El valor de esta opción es emitida en el fuente de JavaCC. Valor por defecto:true. |
VISITOR |
Inserta un método jjAccept() en las clases nodo, y genera una implementación
visitor con una entrada para cada tipo de nodo usado en la gramática. Valor por defecto:false. |
Node Scope Hooks
Si la opción NODE_SCOPE_HOOK está seteada como verdadera, JJTree genera llamadas a dos métodos de parsing definidos por el usuario en la entrada y salida de cada alcance de nodo. Los métodos deben tener las siguientes signaturas:
void jjtreeOpenNodeScope(Node n)
void jjtreeCloseNodeScope(Node n)
Si el parser es STATIC estos métodos también estarán declarados como estáticos. Ambos métodos son llamados con el nodo actual como un parámetro.
Una de las funciones de estos métodos es almacenar el primer token y el
token actual, para que la entrada pueda ser reproducida fácilmente. Por
ejemplo:
void jjtreeOpenNodeScope(Node n)
{
((MySimpleNode)n).first_token = getToken(1);
}
void jjtreeCloseNodeScope(Node n)
{
((MySimpleNode)n).last_token = getToken(0);
}
donde MySimpleNode se basa en SimpleNode y tiene los siguientes campos adicionales:
- Token first_token
- last_token;
Otra funcionalidad podría ser almacenar el objeto parser en el nodo para
proveer el estado que debería ser compartido por todos los nodos producidos
por el parser. Por ejemplo, el parser podría mantener una tabla de símbolos.
Visitor Support
JJTree provee soporte básico para el pattern de diseño visitor. Si la opción VISITOR está seteada como true, JJTree insertará un método
jjtAccept() en todas las clases de nodos que genera, y también genera una
interface visitor que puede ser implementada y pasada a los nodos para
aceptar.
El nombre de la interface visitor es construída adicionando Visitor al
nombre del parser. La interface se regenera cada vez que JJTree se ejecuta,
de tal forma que representa exactamente el conjunto de nodos utilizados
por el parser. Esto causará errores de compilación si la clase de implementación
no ha sido actualizada para los nodos nuevos.