Sí, es posible. Cómo hacerlo dependerá de la implementación que desee. He aquí una muestra que podría funcionar para usted:
En primer lugar, definir su nodo:
class ParseTreeNode {
private final String name;
private final List<ParseTreeNode> children = /* new */;
public ParseTreeNode(String name) {
this.name = name;
}
public void addChild(ParseTreeNode child) {
children.add(child);
}
A continuación, tendrá que integrar esto en sus funciones descendente recursivo:
class RDParser {
ParseTreeNode parse(Input input) {
ParseTreeNode root = createParseTreeNodeNamed("Root")
switch (input.nextToken()) {
case OPT1:
root.addChild(createParseTreeNodeNamed("Opt1"));
break;
case OPT2:
while (/*someCondition*/) {
root.addChild(createParseTreeNodeNamed("Opt2-sibling" + /* i */));
}
case SUBTREE:
ParseTreeNode subtree = createParseTreeNodeNamed("Subtree");
root.addChild(subtree);
parseSubtree(subtree, input);
break;
default:
error("Input %s was not in the expected first/follow sets", input.nextToken());
}
}
void parseSubtree(ParseTreeNode node, Input input) {
node.addChild(createParseTreeNodeNamed("subtree-child"));
/* ... */
}
/* and other functions do similarly */
ParseTreeNode createParseTreeNodeNamed(String name) {
return new ParseTreeNode(name);
}
}
Como desciende por su árbol de análisis sintáctico, probablemente quiera enviar lo que sea que sea el nuevo nodo "raíz", para que se puedan agregar los elementos secundarios. Alternativamente, parseSubtree
podría crear y devolver un nodo, que luego se agregaría al nodo raíz.
Puede construir el árbol de análisis sintáctico o un árbol abstracto simple utilizando el proceso anterior. Como la función de análisis devuelve el nodo raíz, que hará referencia a todos los nodos secundarios, tendrá acceso completo al árbol de análisis sintáctico después del análisis.
Si utiliza un árbol de análisis heterogéneo u homogéneo, necesitará una forma de almacenar información suficiente para hacerlo útil.
Excelente respuesta, Kaleb. Me hizo funcionar al instante, ¡y creo que ahora mismo podré escribirlo! Pero, ¿pueden aclarar la diferencia entre "árbol de análisis sintáctico" y "árbol de resumen" y "análisis de árbol heterogéneo" y "homogéneo"? (Todavía no sé la diferencia pero me gustaría saberlo) – bodacydo
homogéneo - Un árbol que consta del mismo tipo de nodos. heterogéneo - Un árbol que consiste en nodos de diferentes tipos. Un árbol de análisis representa la estructura de los datos de entrada y generalmente contiene sintaxis innecesaria. Un árbol de sintaxis abstracta es aquel que mantiene la estructura e información esenciales, pero elimina la estructura o sintaxis innecesarias. Modifiqué mi publicación para mostrar cómo el árbol crece más profundo, espero que aclare. –
¡Gracias por explicarme! Ya estoy implementando. :) Preguntaré si me quedo atascado. Mi árbol va a ser un árbol abstracto y heterogéneo. :) – bodacydo