public sentencia(String tipo, List <String> ids, arbol_expresion expresion, int fila, int columna) { this.tipo = tipo; this.ids = ids; this.expresion = expresion; this.fila = fila; this.columna = columna; }
public static nodo_expresion dibujarEXP(sentencia sentencia) { if (sentencia.expresion.raiz.parametros.Count > 1) { errores.errores.add_error("Error Semantico", "Parametros incorrectos en funcion DibujarEXP", sentencia.fila, sentencia.columna); return(new nodo_expresion("error", "error", "error", sentencia.fila, sentencia.columna)); } arbol_expresion expresion = sentencia.expresion.raiz.parametros.ElementAt(0); //probar que la ruta exista String ruta = @const.RUTA; ruta = ruta.Replace("/", "\\\\").Replace("\"", ""); if (Directory.Exists(ruta)) { @const.dibujar_expresion(expresion.raiz, @const.get_nombre_expresion()); } else { Directory.CreateDirectory(ruta); @const.dibujar_expresion(expresion.raiz, @const.get_nombre_expresion()); } return(@const.VOID); }
public nodo_expresion extraer_arbol(ParseTreeNode raiz) { String termino = "", token = ""; if (raiz.Term != null) { termino = raiz.Term.ToString(); } if (raiz.Token != null) { token = raiz.Token.Text; } if (termino.Equals("NUMERO") || termino.Equals("CADENA") || termino.Equals("True") || termino.Equals("False") || termino.Equals("ID")) { String tipo = ""; if (termino.Equals("NUMERO")) { tipo = "number"; } else if (termino.Equals("CADENA")) { tipo = "string"; } else if (termino.Equals("True")) { token = "1"; tipo = "bool"; } else if (termino.Equals("False")) { token = "0"; tipo = "bool"; } else { tipo = "id"; } nodo_expresion nuevo = new nodo_expresion(token.Replace("\"", ""), "terminal", tipo, raiz.Token.Location.Line, raiz.Token.Location.Column); return(nuevo); } else if (termino.Equals("llamar_funcion")) { nodo_expresion funcion = new nodo_expresion(raiz.ChildNodes.ElementAt(0).Token.Text, "llamar_funcion", "llamar_funcion", raiz.ChildNodes.ElementAt(0).Token.Location.Line, raiz.ChildNodes.ElementAt(0).Token.Location.Column); List <arbol_expresion> expresiones = new List <arbol_expresion>(); ParseTreeNode lista = raiz.ChildNodes.ElementAt(1); for (int i = 0; i < lista.ChildNodes.Count; i++) { arbol_expresion arbol = new arbol_expresion(); arbol.raiz = extraer_arbol(lista.ChildNodes.ElementAt(i)); expresiones.Add(arbol); } funcion.parametros = expresiones; //METER PARAMETROS AL NODO return(funcion); } else if (termino.Equals("exprecion")) { if (raiz.ChildNodes.Count == 3) { nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0)); nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2)); nodo_expresion op = extraer_arbol(raiz.ChildNodes.ElementAt(1)); op.izq = izq; op.der = der; return(op); } else if (raiz.ChildNodes.Count == 2) { nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(1)); nodo_expresion op = extraer_arbol(raiz.ChildNodes.ElementAt(0)); op.izq = izq; return(op); } else { nodo_expresion nodo = extraer_arbol(raiz.ChildNodes.ElementAt(0)); return(nodo); } } else if (termino.Equals("relacion")) { nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0)); nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2)); nodo_expresion op = extraer_arbol(raiz.ChildNodes.ElementAt(1)); op.izq = izq; op.der = der; return(op); } else if (termino.Equals("condicion")) { if (raiz.ChildNodes.Count == 3) { nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(0)); nodo_expresion der = extraer_arbol(raiz.ChildNodes.ElementAt(2)); nodo_expresion op = extraer_arbol(raiz.ChildNodes.ElementAt(1)); op.izq = izq; op.der = der; return(op); } else if (raiz.ChildNodes.Count == 2) { nodo_expresion izq = extraer_arbol(raiz.ChildNodes.ElementAt(1)); nodo_expresion op = extraer_arbol(raiz.ChildNodes.ElementAt(0)); op.izq = izq; return(op); } else { nodo_expresion nodo = extraer_arbol(raiz.ChildNodes.ElementAt(0)); return(nodo); } } else if (!termino.Equals("exprecion")) { nodo_expresion nuevo; try { nuevo = new nodo_expresion(token, "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } catch (Exception e) { nuevo = new nodo_expresion(token, "operador", "operador", -1, -1); } return(nuevo); } return(null); //Console.WriteLine(termino + " , " + token); }
void recorrer_arbol(ParseTreeNode raiz) { String termino = "", token = ""; if (raiz.Term != null) { termino = raiz.Term.ToString(); } if (raiz.Token != null) { token = raiz.Token.ToString(); } if (termino.Equals("incerteza")) { String numero = raiz.ChildNodes.ElementAt(1).Token.Text; Double incerteza = Double.Parse(numero.Replace('.', ',')); this.interprete.set_incerteza(incerteza); } else if (termino.Equals("ruta")) { String ruta = raiz.ChildNodes.ElementAt(1).Token.Text; this.interprete.set_ruta(ruta); } else if (termino.Equals("incluye")) { String texto = ""; String incluye = raiz.ChildNodes.ElementAt(1).Token.Text; try { String ruta = contenedor.SelectedTab.Name; String[] partes = ruta.Split('\\'); ruta = ""; for (int i = 0; i < partes.Length - 1; i++) { ruta += partes[i] + "\\"; } System.IO.StreamReader file = new System.IO.StreamReader(ruta + incluye); texto = file.ReadToEnd(); file.Close(); analizar(texto); } catch (Exception e) { errores.errores.add_error("Error Semantico", "Archivo " + incluye + " inaccesible", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } /* * String incluye = raiz.ChildNodes.ElementAt(1).Token.Text; * Console.WriteLine("deberÃa de incluir " + incluye); * analizar("Define 666 Define \"nuevo\" Principal () { alo= polisia; }"); */ } else if (termino.Equals("declaracion")) { String tipo = raiz.ChildNodes.ElementAt(0).Token.Text; List <String> ids = new List <string>(); for (int i = 0; i < raiz.ChildNodes.ElementAt(1).ChildNodes.Count; i++) { ids.Add(raiz.ChildNodes.ElementAt(1).ChildNodes.ElementAt(i).Token.Text); } arbol_expresion arbol = new arbol_expresion(); if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0) { arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(1)); //@const.dibujar_expresion(arbol.raiz, "prueba_expresion"); /*nodo_expresion resultado= arbol.ejecutar_arbol(); * Console.WriteLine("----------------------"); * Console.WriteLine(resultado.valor + " " + resultado.tipo + " " + resultado.rol); * Console.WriteLine("----------------------"); */ } interprete.add_sentencia("declarar", ids, arbol, tipo.ToLower(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("declarar_funcion")) { if (raiz.ChildNodes.ElementAt(0).Token.Text.Equals("Principal")) { interprete.funcion_nueva("Principal", interprete.get_funcion(), "void"); raiz.ChildNodes.ForEach(recorrer_arbol); interprete.set_principal(); return; } else { interprete.funcion_nueva(raiz.ChildNodes.ElementAt(1).Token.Text, interprete.get_funcion(), raiz.ChildNodes.ElementAt(0).Token.Text); raiz.ChildNodes.ForEach(recorrer_arbol); interprete.agregar_nombre(pars); pars = ""; interprete.pop_funcion(); return; } } else if (termino.Equals("parametro")) { String tipo = raiz.ChildNodes.ElementAt(0).Token.Text; String nombre = raiz.ChildNodes.ElementAt(1).Token.Text; interprete.add_parametro(tipo, nombre); pars += "#" + tipo.ToLower(); } else if (termino.Equals("asignacion")) { String id = raiz.ChildNodes.ElementAt(0).Token.Text; List <String> lista = new List <string>(); lista.Add(id); nodo_expresion expresion = extraer_arbol(raiz.ChildNodes.ElementAt(2)); arbol_expresion arbol = new arbol_expresion(); arbol.raiz = expresion; interprete.add_sentencia("asignacion", lista, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("retorno_noterminal")) { arbol_expresion arbol = new arbol_expresion(); if (raiz.ChildNodes.Count > 1) { arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(1)); } interprete.add_sentencia("retorno", null, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("sentencia_continuar")) { interprete.add_sentencia("continuar", null, new arbol_expresion(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("sentencia_detener")) { interprete.add_sentencia("detener", null, new arbol_expresion(), raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("call_funcion")) { arbol_expresion arbol = new arbol_expresion(); arbol.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(0)); interprete.add_sentencia("call_funcion", null, arbol, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (termino.Equals("flujo_si")) { List <camino> caminos = new List <camino>(); //extrae la condicion nodo_expresion cond = extraer_arbol(raiz.ChildNodes.ElementAt(0)); //inserta funcion para anidar interprete.funcion_nueva("si", interprete.get_funcion(), "void"); //inserta sentencias recorrer_arbol(raiz.ChildNodes.ElementAt(1)); //obtiene el camino si funcion si = interprete.extraer_funcion(); //agrega primer camino caminos.Add(new camino(cond, si)); //obtener el else if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0) { //si hay else interprete.funcion_nueva("Sino", interprete.get_funcion(), "void"); recorrer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(0)); funcion sino = interprete.extraer_funcion(); caminos.Add(new camino(null, sino)); } interprete.add_sentencia("si", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } else if (termino.Equals("flujo_selecciona")) { List <camino> caminos = new List <camino>(); //extrae la expresion a comparar nodo_expresion expresion = extraer_arbol(raiz.ChildNodes.ElementAt(0)); ParseTreeNode pares = raiz.ChildNodes.ElementAt(1); int caminos_cant = pares.ChildNodes.Count; for (int i = 0; i < caminos_cant; i++) { ParseTreeNode par = pares.ChildNodes.ElementAt(i); //hacer condicion nodo_expresion condicion = new nodo_expresion("==", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); condicion.izq = expresion; //extraer valor nodo_expresion valor = extraer_arbol(par.ChildNodes.ElementAt(0)); condicion.der = valor; //extraer el camino interprete.funcion_nueva("camino", interprete.get_funcion(), "void"); recorrer_arbol(par.ChildNodes.ElementAt(1)); funcion flujo = interprete.extraer_funcion(); //insertar el camino caminos.Add(new camino(condicion, flujo)); } //obtener el Defecto if (raiz.ChildNodes.ElementAt(2).ChildNodes.Count > 0) { //si hay defecto interprete.funcion_nueva("defecto", interprete.get_funcion(), "void"); recorrer_arbol(raiz.ChildNodes.ElementAt(2).ChildNodes.ElementAt(0)); funcion defecto = interprete.extraer_funcion(); caminos.Add(new camino(null, defecto)); } interprete.add_sentencia("selecciona", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } else if (termino.Equals("flujo_para")) { //crear sentencia de asignacion inicial List <String> id = new List <string>(); id.Add(raiz.ChildNodes.ElementAt(1).Token.Text); arbol_expresion expresion = new arbol_expresion(); expresion.raiz = extraer_arbol(raiz.ChildNodes.ElementAt(3)); sentencia asignacion_inicial = new sentencia("declarar", id, expresion, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); asignacion_inicial.tipo_dato = "number"; //extraer condicion nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(4)); //sacar flujo List <camino> caminos = new List <camino>(); //inserta funcion para anidar interprete.funcion_nueva("para", interprete.get_funcion(), "void"); //inserta sentencias recorrer_arbol(raiz.ChildNodes.ElementAt(6)); //obtiene el camino funcion para = interprete.extraer_funcion(); //meter paso al flujo nodo_expresion op = new nodo_expresion("", "", "", -1, -1); nodo_expresion var = new nodo_expresion(id.ElementAt(0), "terminal", "id", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); nodo_expresion uno = new nodo_expresion("1", "terminal", "NUMERO", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); if (raiz.ChildNodes.ElementAt(5).Token.Text.Equals("++")) { op = new nodo_expresion("+", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } else if (raiz.ChildNodes.ElementAt(5).Token.Text.Equals("--")) { op = new nodo_expresion("-", "operador", "operador", raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); } op.izq = var; op.der = uno; arbol_expresion asignacion = new arbol_expresion(); asignacion.raiz = op; sentencia paso = new sentencia("asignacion", id, asignacion, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); para.add_sentencia(paso); //agrega primer camino caminos.Add(new camino(condicion, para)); //meter sentencia interprete.add_sentencia("para", asignacion_inicial, caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } else if (termino.Equals("flujo_hasta")) { //extraer condicion nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(0)); //sacar flujo List <camino> caminos = new List <camino>(); //inserta funcion para anidar interprete.funcion_nueva("hasta", interprete.get_funcion(), "void"); //inserta sentencias recorrer_arbol(raiz.ChildNodes.ElementAt(1)); //obtiene el camino funcion hasta = interprete.extraer_funcion(); //agrega primer camino caminos.Add(new camino(condicion, hasta)); //meter sentencia interprete.add_sentencia("hasta", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } else if (termino.Equals("flujo_mientras")) { //extraer condicion nodo_expresion condicion = extraer_arbol(raiz.ChildNodes.ElementAt(0)); //sacar flujo List <camino> caminos = new List <camino>(); //inserta funcion para anidar interprete.funcion_nueva("mientras", interprete.get_funcion(), "void"); //inserta sentencias recorrer_arbol(raiz.ChildNodes.ElementAt(1)); //obtiene el camino funcion mientras = interprete.extraer_funcion(); //agrega primer camino caminos.Add(new camino(condicion, mientras)); //meter sentencia interprete.add_sentencia("mientras", new arbol_expresion(), caminos, raiz.FindToken().Location.Line, raiz.FindToken().Location.Column); return; } //Console.WriteLine("-"+termino+"-"+ token+"-"); raiz.ChildNodes.ForEach(recorrer_arbol); }
public void add_sentencia(String tipo, arbol_expresion expresion, List <camino> caminos, int fila, int columna) { sentencia s = new sentencia(tipo, null, expresion, "", caminos, fila, columna); actual.add_sentencia(s); }
public void add_sentencia(String tipo, List <String> ids, arbol_expresion expresion, String tipo_dato, int fila, int columna) { sentencia s = new sentencia(tipo, ids, expresion, tipo_dato, null, fila, columna); actual.add_sentencia(s); }
public camino(nodo_expresion raiz, funcion funcion) { this.condicion = new arbol_expresion(); this.condicion.raiz = raiz; this.funcion = funcion; }