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:
public static Node jjtCreate(int id)
Valor por defecto:false
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,
 public static Node MyNode.jjtCreate(MyParser p, int id);
          MyNode(MyParser p, int id); 
Valor por defecto:false.
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.