private static void recorrerExpresion(ParseNode actual, string padre) { //1.-verificamos el nombre del nodo string nombre_actual = "n" + contador; string valor = actual.ToString(); string nombre_nodo = ""; switch (valor) { case "&&": case "||": case "|&": case "!": nombre_nodo = "Logico|" + actual.ToString(); break; case "<": case "<=": nombre_nodo = "Relac|" + actual.ToString().Replace("<", "<"); break; case ">": case ">=": nombre_nodo = "Relac|" + actual.ToString().Replace(">", ">"); break; case "==": case "!=": case "~": nombre_nodo = "Relac|" + actual.ToString(); break; case "+": case "-": case "*": case "/": case "%": case "^": nombre_nodo = "Aritm|" + actual.ToString(); break; default: string tipo = actual.Tipo; switch (tipo) { case "Int": case "Double": nombre_nodo = "Number|" + actual.ToString(); break; case "Bool": nombre_nodo = "Bool|" + actual.ToString(); break; case "String": nombre_nodo = "String|" + actual.ToString(); break; case "Char": nombre_nodo = "Char|" + actual.ToString(); break; case "(tk_id)": nombre_nodo = "Variable|" + actual.ToString(); break; case "<LLAMADA>": nombre_nodo = "Funcion|" + actual.izq().ToString(); break; default: nombre_nodo = actual.ToString(); break; } break; } grafo += nombre_actual + "[label=\"" + nombre_nodo + "\"];\n";//genero el nodo if (!string.IsNullOrEmpty(padre)) { grafo += padre + "->" + nombre_actual + ";\n";//padre apunta a actual } if ("<LLAMADA>".Equals(actual.ToString())) { contador++; return;//para no revisar que tiene llamada y meterlo accidentalmente en el dibujo } foreach (ParseNode hijo in actual.childNodes) { contador++; recorrerExpresion(hijo, nombre_actual); } }
public static bool graficarArbol(ParseNode raiz) { return(Archivo.guardar(dibujar(raiz), @"D:/Sistemas/2018/OLC/proyecto_2/arbol_prueba.dot")); }
public static void miAST(ParseTreeNode raiz, ParseNode actual) { int fila = 0; int columna = 0; int limite; ParseNode nuevo = null; foreach (ParseTreeNode hijo in raiz.ChildNodes) { string valor = hijo.ToString(); if (hijo.Token != null) { fila = hijo.Token.Location.Line; columna = hijo.Token.Location.Column; } switch (valor) { case "<INICIO>": case "<SENTENCIAS>": //NUEVO case "<SENTENCIAWS>": //NUEVO miAST(hijo, actual); break; case "<IMPORTS>": case "<DEFINES>": case "<CUERPO>": case "<DECLARACION>": case "<ASIGNACION>": case "<ASIGNAR>": case "<ID>": case "<METODO>": case "<PARAMETRO>": case "<SENTENCIA>": //case "<SENTENCIAS>": case "<VALORES>": case "<LLAMADA>": case "<MAIN>": case "<IF>": case "<FOR>": case "<OP>": case "<SWITCH>": case "<CASE>": case "<CASES>": case "<DEFAULT>": case "<ELSE>": case "<WHILE>": case "<DO>": case "<SENTENCIAW>": case "<RETORNO>": case "<MOSTRAR>": case "<DIBUJAR>": //case "<SENTENCIAWS>": nuevo = new ParseNode(fila, columna, valor); miAST(hijo, nuevo); actual.add(nuevo); break; case "<PARAMETROS>": //case "<ASIGNACION>"://simplemente agregan sus hijos al padre miAST(hijo, actual); break; case "<CONDICION>": /*if ("<ASIGNACION>".Equals(raiz.ToString())||"<VALORES>".Equals(raiz.ToString())) * { * miAST(hijo, actual); * }*/ if ("<CONDICION>".Equals(raiz.ToString())) { limite = raiz.ChildNodes.Count; //hijos de <CONDICION> if (limite == 1) { miAST(hijo, actual); } else if (limite == 2) //NOT { nuevo = new ParseNode(raiz.ChildNodes[0].Token); miAST(raiz.ChildNodes[1], nuevo); //agrego valor der actual.add(nuevo); return; } else if (limite == 3) { nuevo = new ParseNode(raiz.ChildNodes[1].Token); miAST(raiz.ChildNodes[0], nuevo); //agrego valor izq miAST(raiz.ChildNodes[2], nuevo); //agrego valor der actual.add(nuevo); return; } } else { miAST(hijo, actual); } break; case "<COMPARACION>": limite = hijo.ChildNodes.Count; if (limite == 1) { miAST(hijo, actual); } else if (limite == 3) { nuevo = new ParseNode(hijo.ChildNodes[1].Token); miAST(hijo.ChildNodes[0], nuevo); //agrego valor izq miAST(hijo.ChildNodes[2], nuevo); //agrego valor der actual.add(nuevo); } break; case "<E>": if ("<COMPARACION>".Equals(raiz.ToString()) || "<FOR>".Equals(raiz.ToString())) { miAST(hijo, actual); } else { limite = raiz.ChildNodes.Count; //hijos de <E> if (limite == 1) { fila = hijo.ChildNodes[0].Token.Location.Line; columna = hijo.ChildNodes[0].Token.Location.Column; string val = hijo.ChildNodes[0].ToString(); actual.add(fila, columna, val); } else if (limite == 3) { nuevo = new ParseNode(raiz.ChildNodes[1].Token); miAST(raiz.ChildNodes[0], nuevo); //agrego valor izq miAST(raiz.ChildNodes[2], nuevo); //agrego valor der actual.add(nuevo); return; } } break; case "<CONTINUAR>": case "<DETENER>": nuevo = new ParseNode(fila, columna, valor); actual.add(nuevo); //solo agrego la directiva break; default: if (!"<CONDICION>".Equals(raiz.ToString())) { actual.add(fila, columna, valor); } break; } } }
private static void recorrerFuncion(ParseNode actual) { //0.-Recorro los hijos de actual y declaro puntos y nodos string nodo_actual; string punto_actual; string padre; foreach (ParseNode hijo in actual.childNodes) { //1.-Nombre del nodo y su punto ayudante nodo_actual = "n" + contador; punto_actual = "punto_" + contador; //2.-Declaracion de los nodos en graphviz grafo += "{rank=same;\n" + punto_actual + "[shape=point];\n" + nodo_actual + "[label=\"" + hijo.ToString() + "\"];}\n"; //3.-Saco el tope de la pila nodos para que apunte a el punto actual padre = nodos.Pop(); //4.-Pongo los respectivos "punteros" grafo += padre + "->" + punto_actual + "[arrowhead=none];\n" + punto_actual + "->" + nodo_actual + ";\n"; contador++; nodos.Push(punto_actual); if (hijo.izq() != null) { //nodos.Push(punto_actual); nodos.Push(nodo_actual); //recorrerFuncion(hijo); string tipo = hijo.Tipo; switch (tipo) { case "<RETORNO>": if (hijo.der() != null) { hijo.childNodes.Clear(); hijo.add(0, 0, "<COND>"); } break; case "<DECLARACION>": hijo.childNodes.RemoveAt(0); break; case "<ID>": hijo.childNodes.Clear(); break; case "<ASIGNACION>": hijo.childNodes.Clear(); hijo.add(0, 0, "<COND>"); break; case "<IF>": hijo.childNodes.RemoveAt(0); hijo.izq().childNodes.Clear(); hijo.izq().Valor = "<COND>"; break; case "<ELSE>": hijo.childNodes.RemoveAt(0); break; } recorrerFuncion(hijo); } //nodos.Pop(); } nodos.Pop(); }