JavaCC - JJTree: La clase node
Objetos Node
Todos los nodos del árbol de sintaxis abstracta (abstract sintax tree o
AST) deben implementar esta interface. Provee la maquinaria básica para
construir las relaciones padre-hijo entre nodos.
public interface Node { public void jjtOpen(); /** Este método se invoca luego de que el nodo pasa a ser el nodo actual. Indica que ahora se le pueden asociar nodos hijos. */ public void jjtClose(); /** Este método es invocado luego de que todos los nodos hijos han sido agregados. */ public void jjtSetParent(Node n); public Node jjtGetParent(); /** Este par de métodos se usan para informar al nodo acerca de sus padres. */ public void jjtAddChild(Node n, int i); /** Este método indica al nodo que debe agregar el argumento a su lista de hijos. */ public Node jjtGetChild(int i); /** Este método retorna un nodo hijo. Los hijos están numerados de izquierda a derecha, comenzando por el nodo 0 (cero). */ int jjtGetNumChildren(); /** Retorna la cantidad de hijos que tiene el nodo */ }
La clase SimpleNode
implementa la interface Node y si aún no existe es generada automáticamente por JJTree. Esta clase puede utilizarse como template o superclase para las implementaciones de nodo, o puede ser modificada. Además, SimpleNode
provee un mecanismo rudimentario para "jerarquizar" el nodo
y sus hijos. Podría usarse en una acción como la siguiente:
{ ((SimpleNode)jjtree.rootNode()).dump(">"); }
El parámetro String
para dump()
se usa en la salida para indicar qué líneas son parte del árbol. Además podría usarse como un indicador del nivel de profundidad de cada no terminal, pero para ello es menester realizar algunas modificaciones en la clase SimpleNode antes de compilar los archivos .java; en el método dump definido por defecto como:
debe agregarse un parámetro adicional, prefix1, que en la primera invocación será igual a prefix, pero que en las sucesivas invocaciones del método permanecerá inmutable, mientras que prefix irá incrementando su longitud concantenando prefix1, de acuerdo al nivel en la jerarquía.
Si la opción VISITOR está seteada, se genera otro método de utilidad:
{ public void childrenAccept(MyParserVisitor visitor); }
Esto en cambio transita sobre los hijos de los nodos, interrogándodos para aceptar el visitor. Esto puede ser muy usado cuando se implementan recorridos en preorden y postorden.