public static void agregarMF(String t, String n, String r, ParseTreeNode nodo, ArrayList p) { Boolean existe = false; for (int i = 0; i < listaMetodoFuncion.Count; i++) { MF m = (MF)listaMetodoFuncion[i]; if (m.nombre.Equals(n) && p.Count == m.parametro.Count) { int cantidad = 0; for (int j = 0; j < p.Count; j++) { Parametro p1 = (Parametro)p[j]; Parametro p2 = (Parametro)m.parametro[j]; if (p1.nombre == p2.nombre && p1.tipo == p2.tipo) { // existe = true; cantidad += 1; } } if (cantidad == m.parametro.Count) { existe = true; } if (parametros.Count == 0 && m.parametro.Count == 0) { existe = true; } } } if (existe == false) { MF mf = new MF(); mf.nombre = n; mf.tipo = t; mf.retorno = r; mf.nodo = nodo; mf.parametro = (ArrayList)parametros.Clone(); listaMetodoFuncion.Add(mf); } else { Reporte.agregarError("Ya existe un metodo o funcion llamada " + n, "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); Listas.MensajeConsola.Add("> Ya existe un metodo o funcion llamada " + n + "\n"); } }
public static ParseTreeNode analizar(String cadena) { Gramatica gramatica = new Gramatica(); LanguageData lenguaje = new LanguageData(gramatica); Parser parser = new Parser(lenguaje); // MessageBox.Show("parser"); //Error de Gramatica ParseTree arbol = parser.Parse(cadena); ParseTreeNode raiz = arbol.Root; //foreach (var item in arbol.ParserMessages) //{ // // Irony.LogMessage log = arbol.ParserMessages[item]; // //log.Location.Line.ToString(); //} for (int i = 0; i < arbol.ParserMessages.Count; i++) { Irony.LogMessage log = arbol.ParserMessages[i]; String[] dato = log.Level.ToString().Split(':'); String tipo = ""; String mensaje = log.Message.ToString(); if (dato[0] == "Invalid character") { tipo = "Error Lexico"; mensaje = mensaje.Replace("Invalid character", "Caracter invalido:"); } else { tipo = "Error Sintactico"; mensaje = mensaje.Replace("Syntax error, expected:", "Se esperaba:"); } Reporte.agregarError(mensaje, tipo, log.Location.Line, log.Location.Column); } if (raiz == null) { return(raiz); } else { generarArbol(raiz); return(raiz); } }
public static void generarAST(ParseTreeNode raiz, String nombre) { if (raiz == null) { Reporte.agregarMensajeError("La funcion es vacia", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); return; } String grafodot = DIBUJAR.getDotFuncion(raiz); String ruta = ""; if (Listas.ruta == "") { ruta = Listas.rutaDefinida + nombre; } else { if (Directory.Exists(Listas.ruta)) { ruta = Listas.quitarEspaciosFinal(Listas.ruta) + "\\" + nombre; } else { Reporte.agregarError("No existe ruta: " + ruta, "Error General", 0, 0); ruta = Listas.rutaDefinida + nombre; } } using (System.IO.StreamWriter file = new System.IO.StreamWriter(ruta + ".dot")) { file.WriteLine(grafodot); } ProcessStartInfo startInfo = new ProcessStartInfo("C:\\Program Files (x86)\\Graphviz 2.28\\bin\\dot.exe"); startInfo.Arguments = "dot -Tpng \"" + ruta + ".dot\" -o \"" + ruta + ".png\""; try { Process.Start(startInfo); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
public static String action(ParseTreeNode nodo) { String result = null; switch (nodo.Term.Name.ToString()) { case "INICIO": { if (nodo.ChildNodes.Count == 1) { action(nodo.ChildNodes[0]); } else if (nodo.ChildNodes.Count == 2) { action(nodo.ChildNodes[0]); action(nodo.ChildNodes[1]); } break; } case "ENTRADA": { if (nodo.ChildNodes.Count == 1) { Variables.pilaAmbito.Push("Global"); Variables.nivelAmbito = 0; action(nodo.ChildNodes[0]); } break; } case "ENCABEZADO": { if (nodo.ChildNodes.Count == 1) { action(nodo.ChildNodes[0]); } else if (nodo.ChildNodes.Count == 2) { action(nodo.ChildNodes[0]); action(nodo.ChildNodes[1]); } break; } case "C": if (nodo.ChildNodes.Count == 2) { String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split('(')); if (dato[1] == "numero)") { Listas.incerteza = Double.Parse(dato[0]); } else if (dato[1] == "cadena)") { String ruta = dato[0]; if (Directory.Exists(ruta)) { Listas.ruta = ruta; } else { Reporte.agregarError("No existe ruta: " + ruta, "Error General", 0, 0); // Listas.ruta = "C:/Users/Aylin/Documents/Visual Studio 2015/Projects/SBScript"; } } } else if (nodo.ChildNodes.Count == 3) { Listas.incluir.Push(Listas.archivo.Peek().ToString()); Listas.nodoActual = nodo.ChildNodes[0]; String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Form1 f = new Form1(); f.incluirArchivo(dato[0] + ".sbs"); Listas.incluir.Pop(); } break; case "TIPO": { if (nodo.ChildNodes.Count == 1) { String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); result = numero[0]; } break; } case "MOSTRAR": { if (nodo.ChildNodes.Count == 5) { Reporte.agregarMensajeError("No puede imprimir en el area de variables globales", "Error Semantico", 0, 0); } break; } case "DIBUJAR": { if (nodo.ChildNodes.Count == 5) { //result = action(node.ChildNodes[0]); } break; } case "INSTRUCCIONES": { if (nodo.ChildNodes.Count == 1) { action(nodo.ChildNodes[0]); } else if (nodo.ChildNodes.Count == 2) { action(nodo.ChildNodes[0]); action(nodo.ChildNodes[1]); } break; } case "INSTRUCCION": { if (nodo.ChildNodes.Count == 1) { action(nodo.ChildNodes[0]); } else if (nodo.ChildNodes.Count == 2) { //action(node.ChildNodes[0]); } break; } case "METODO": { Metodo_Funcion.parametros.Clear(); ArrayList lista = new ArrayList(); if (nodo.ChildNodes.Count == 6) { String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[1]; Metodo_Funcion.agregarMF("Void", dato[0], "", null, lista); } else if (nodo.ChildNodes.Count == 7) { String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[1]; Metodo_Funcion.agregarMF("Void", dato[0], "", nodo.ChildNodes[5], lista); } else if (nodo.ChildNodes.Count == 8) { action(nodo.ChildNodes[3]); Listas.nodoActual = nodo.ChildNodes[1]; String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Metodo_Funcion.agregarMF("Void", dato[0], "", nodo.ChildNodes[6], Metodo_Funcion.parametros); } break; } case "FUNCION": { Metodo_Funcion.parametros.Clear(); ArrayList lista = new ArrayList(); if (nodo.ChildNodes.Count == 6) { String tipo = action(nodo.ChildNodes[0]); String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[1]; Metodo_Funcion.agregarMF(tipo, dato[0], "", null, lista); } else if (nodo.ChildNodes.Count == 7) { String tipo = action(nodo.ChildNodes[0]); String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[1]; if (nodo.ChildNodes[3].Term.Name.ToString() == "varPARAMETRO") { action(nodo.ChildNodes[3]); Metodo_Funcion.agregarMF(tipo, dato[0], "", null, Metodo_Funcion.parametros); } else { Metodo_Funcion.agregarMF(tipo, dato[0], "", nodo.ChildNodes[5], lista); } } else if (nodo.ChildNodes.Count == 8) { action(nodo.ChildNodes[3]); String tipo = action(nodo.ChildNodes[0]); String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Metodo_Funcion.agregarMF(tipo, dato[0], "", nodo.ChildNodes[6], Metodo_Funcion.parametros); } break; } case "varPARAMETRO": { if (nodo.ChildNodes.Count == 2) // { String t = action(nodo.ChildNodes[0]); String[] dato = (nodo.ChildNodes.ElementAt(1).ToString().Split(' ')); Metodo_Funcion.agregarParametro(t, dato[0]); } else if (nodo.ChildNodes.Count == 4) { action(nodo.ChildNodes[0]); String t = action(nodo.ChildNodes[2]); String[] dato = (nodo.ChildNodes.ElementAt(3).ToString().Split(' ')); Metodo_Funcion.agregarParametro(t, dato[0]); } break; } case "RETORNAR": { // MessageBox.Show("TIPO"); if (nodo.ChildNodes.Count == 3) { action(nodo.ChildNodes[1]); } break; } case "MAIN": { Metodo_Funcion.parametros.Clear(); ArrayList vacio = new ArrayList(); if (nodo.ChildNodes.Count == 6) { Listas.nodoActual = nodo.ChildNodes[0]; if (Listas.incluir.Count == 0) { Metodo_Funcion.agregarMF("MAIN", "MAIN", "", nodo.ChildNodes[4], vacio); } } break; } case "LLAMADA": { if (nodo.ChildNodes.Count == 4) { action(nodo.ChildNodes[2]); } else if (nodo.ChildNodes.Count == 5) { result = action(nodo.ChildNodes[2]); } break; } case "TipoPARAMETRO": { if (nodo.ChildNodes.Count == 3) { } break; } case "SI": { if (nodo.ChildNodes.Count == 7) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[5]); } else if (nodo.ChildNodes.Count == 8) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[5]); action(nodo.ChildNodes[7]); } break; } case "ELSE": { if (nodo.ChildNodes.Count == 2) { action(nodo.ChildNodes[1]); } else if (nodo.ChildNodes.Count == 4) { action(nodo.ChildNodes[2]); } break; } case "CICLO": { if (nodo.ChildNodes.Count == 7) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[5]); } break; } case "SWITCH": { if (nodo.ChildNodes.Count == 5) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[4]); } else if (nodo.ChildNodes.Count == 6) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[4]); action(nodo.ChildNodes[5]); } else if (nodo.ChildNodes.Count == 7) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[5]); } break; } case "DEFAULT": { if (nodo.ChildNodes.Count == 5) { action(nodo.ChildNodes[3]); } break; } case "FOR": { if (nodo.ChildNodes.Count == 7) { action(nodo.ChildNodes[2]); action(nodo.ChildNodes[5]); } break; } case "PARA": { if (nodo.ChildNodes.Count == 8) { action(nodo.ChildNodes[3]); action(nodo.ChildNodes[5]); action(nodo.ChildNodes[7]); } break; } case "EXPRESION": { if (nodo.ChildNodes.Count == 1) { result = action(nodo.ChildNodes[0]); } break; } case "OpARITMETICO": { if (nodo.ChildNodes.Count == 1) { result = action(nodo.ChildNodes[0]); } break; } case "E": { // MessageBox.Show("E"); //if (nodo.ChildNodes.Count == 1) //{ // result = resolverOperacion(nodo).ToString(); //} //else if (nodo.ChildNodes.Count == 3) //{ // result = resolverOperacion(nodo).ToString(); //} break; } default: break; } return(result); }