private void btnEjecutar_Click(object sender, EventArgs e) { Limpiar(); Listas.archivo.Clear(); String nombre = tabControl1.SelectedTab.AccessibilityObject.Name.ToString(); Listas.archivo.Push(nombre); nombreTab = nombre; var rich = (RichTextBox)tabControl1.TabPages[tabControl1.SelectedIndex].Controls[0]; ParseTreeNode resultado = Analizador.analizar(rich.Text); if (resultado != null) { MessageBox.Show("El arbol fue construido correctamente"); PrimerRecorrido.action(resultado); RecorridoGlobal.action(resultado); ParseTreeNode nodoPrincipal = Metodo_Funcion.buscarMetodo("MAIN"); if (nodoPrincipal != null) { Variables.pilaAmbito.Push("Principal"); Variables.nivelAmbito += 1; SegundoRecorrido.continuar = false; SegundoRecorrido.detener = false; SegundoRecorrido.retornar = false; SegundoRecorrido.action(nodoPrincipal); } imprimirVariables(); imprimir(); } else { MessageBox.Show("ERROR: Deberia de revisar la cadena de entrada"); } }
public static String action(ParseTreeNode nodo) { String result = null; String variables = ""; 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 "TIPO": { if (nodo.ChildNodes.Count == 1) { String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); result = numero[0]; } break; } case "DECLARACION": { if (nodo.ChildNodes.Count == 3) { String tipo = action(nodo.ChildNodes[0]); String vars = action(nodo.ChildNodes[1]); String[] var = (vars.Split(',')); String ambito = Variables.pilaAmbito.Peek().ToString(); for (int i = 0; i < var.Length - 1; i++) { Variables.declararVariable(tipo, var[i], "", ambito); } } else if (nodo.ChildNodes.Count == 4 || nodo.ChildNodes.Count == 5) { String tipo = action(nodo.ChildNodes[0]); String vars = action(nodo.ChildNodes[1]); String[] var = (vars.Split(',')); String asig = action(nodo.ChildNodes[3]); String ambito = Variables.pilaAmbito.Peek().ToString(); if (asig != "error") { for (int i = 0; i < var.Length - 1; i++) { Variables.declararVariable(tipo, var[i], asig, ambito); } } else { Reporte.agregarMensajeError("Error al declarar la expresion en una variable global", "Error Semantico", 0, 0); } } break; } case "VAR": { if (nodo.ChildNodes.Count == 1) { String[] numero = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); variables += numero[0] + ","; result = variables; } else if (nodo.ChildNodes.Count == 3) { result = action(nodo.ChildNodes[0]); String[] dato = nodo.ChildNodes.ElementAt(2).ToString().Split(' '); result += dato[0] + ","; } break; } case "ASIGNACION": { if (nodo.ChildNodes.Count == 3 || nodo.ChildNodes.Count == 4) { String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); String asig = action(nodo.ChildNodes[2]); String ambito = Variables.pilaAmbito.Peek().ToString(); Variables.asignarVariable(dato[0], asig, ambito); } 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 "RETORNAR": { // MessageBox.Show("TIPO"); if (nodo.ChildNodes.Count == 3) { action(nodo.ChildNodes[1]); } break; } case "LLAMADA(": { Metodo_Funcion.parametrosTemp.Clear(); if (nodo.ChildNodes.Count == 3) { String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[0]; ParseTreeNode metodo = Metodo_Funcion.buscarMetodo(dato[0]); if (metodo != null) { Variables.pilaAmbito.Push(dato[0]); Variables.nivelAmbito += 1; SegundoRecorrido.action(metodo); Variables.eliminarAmbito(); } else { Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); } } else if (nodo.ChildNodes.Count == 4) { String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[0]; ParseTreeNode metodo = null; if (nodo.ChildNodes[2].Term.Name.ToString() == "TipoPARAMETRO") { action(nodo.ChildNodes[2]); metodo = Metodo_Funcion.buscarMetodo(dato[0]); if (metodo != null) { Variables.pilaAmbito.Push(dato[0]); Variables.nivelAmbito += 1; Metodo_Funcion.guardarParametro(dato[0]); SegundoRecorrido.action(metodo); Variables.eliminarAmbito(); } else { Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); } } else { metodo = Metodo_Funcion.buscarMetodo(dato[0]); if (metodo != null) { Variables.pilaAmbito.Push(dato[0]); Variables.nivelAmbito += 1; // Metodo_Funcion.guardarParametro(); SegundoRecorrido.action(metodo); Variables.eliminarAmbito(); } else { Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); } } } else if (nodo.ChildNodes.Count == 5) { String[] dato = (nodo.ChildNodes.ElementAt(0).ToString().Split(' ')); Listas.nodoActual = nodo.ChildNodes[0]; SegundoRecorrido.action(nodo.ChildNodes[2]); ParseTreeNode metodo = Metodo_Funcion.buscarMetodo(dato[0]); if (metodo != null) { Variables.pilaAmbito.Push(dato[0]); Variables.nivelAmbito += 1; Metodo_Funcion.guardarParametro(dato[0]); SegundoRecorrido.action(metodo); Variables.eliminarAmbito(); } else { Reporte.agregarMensajeError("El metodo/funcion no existe", "Error Semantico", Listas.nodoActual.Token.Location.Line, Listas.nodoActual.Token.Location.Column); } } Metodo_Funcion.parametrosTemp.Clear(); result = SegundoRecorrido.retorno; SegundoRecorrido.retorno = ""; break; } case "TipoPARAMETRO": { if (nodo.ChildNodes.Count == 1) { result = action(nodo.ChildNodes[0]); String tipo = ""; if (PrimerRecorrido.concatenar == true) { tipo = "String"; } else //Number o Bool { if (result == "1" || result == "0") { tipo = "Bool"; } else { tipo = "Number"; } } Metodo_Funcion.agregarParametroTemp(tipo, result); } else if (nodo.ChildNodes.Count == 3) { action(nodo.ChildNodes[0]); result = action(nodo.ChildNodes[2]); String tipo = ""; if (PrimerRecorrido.concatenar == true) { tipo = "String"; } else //Number o Bool { if (result == "1" || result == "0") { tipo = "Bool"; } else { tipo = "Number"; } } Metodo_Funcion.agregarParametroTemp(tipo, result); } 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 || nodo.ChildNodes.Count == 2 || nodo.ChildNodes.Count == 3) { result = SegundoRecorrido.resolverOperacion(nodo).ToString(); } break; } default: break; } return(result); }
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); }