public static void TypeCheck(Nodo n) { if (n.getTipoToken() == token.Type.ID) { n = ActualizarNodo(n); } if (n.hijos[0] != null) { TypeCheck(n.hijos[0]); } if (n.hijos[1] != null) { TypeCheck(n.hijos[1]); } if (n.hijos[2] != null) { TypeCheck(n.hijos[2]); } if (n.getTipoToken() == token.Type.ASIGNACION) { if (n.hijos[0].getTipoToken() != token.Type.ID) { TypeError(n, "Asignacion no valida"); } else if (n.hijos[0].getTipoDato() != n.hijos[1].getTipoDato()) { TypeError(n, "Tipos de dato no coinciden"); n.setTipoDato(token.DataType.ERROR); n.hijos[0].setTipoDato(token.DataType.ERROR); if (Symtab.BuscarVariable(n.hijos[0])) { Symtab.ActualizarVariable(n.hijos[0]); } else { Symtab.AñadirVariable(n.hijos[0]); } } else { n.setTipoDato(n.hijos[0].getTipoDato()); if (Symtab.BuscarVariable(n.hijos[0])) { Symtab.ActualizarVariable(n.hijos[0]); } else { Symtab.AñadirVariable(n.hijos[0]); } } } if (n.getTipoToken() == token.Type.WRITE || n.getTipoToken() == token.Type.READ) { //n.setTipoDato(n.hijos[0].getTipoDato()); bandera = true; temporal.Clear(); Recursivo(n); if (temporal.Contains("REAL") || temporal.Contains("/")) { n.setTipoDato(token.DataType.REAL); } else { n.setTipoDato(token.DataType.INTEGER); } if (n.hijos[0].getTipoToken() == token.Type.ID) { if (Symtab.BuscarVariable(n.hijos[0])) { Symtab.ActualizarVariable(n.hijos[0]); } else { Symtab.AñadirVariable(n.hijos[0]); } } } if (n.getTipoToken() == token.Type.SUMA || n.getTipoToken() == token.Type.RESTA || n.getTipoToken() == token.Type.MULTIPLICACION || n.getTipoToken() == token.Type.DIVISION) { if (!(n.hijos[0].getTipoDato() == token.DataType.INTEGER || n.hijos[0].getTipoDato() == token.DataType.REAL && n.hijos[1].getTipoDato() == token.DataType.INTEGER || n.hijos[1].getTipoDato() == token.DataType.REAL)) { TypeError(n, "Operacion no valida"); n.setTipoDato(token.DataType.ERROR); } else if (n.hijos[0].getTipoDato() != n.hijos[1].getTipoDato()) { TypeError(n, "Tipos de dato no coinciden"); n.setTipoDato(token.DataType.REAL); //n.setTipoDato(token.DataType.ERROR); } else { n.setTipoDato(n.hijos[0].getTipoDato()); } } if (n.getTipoToken() == token.Type.MAYOR_IGUAL || n.getTipoToken() == token.Type.MAYOR_QUE || n.getTipoToken() == token.Type.MENOR_IGUAL || n.getTipoToken() == token.Type.MENOR_QUE || n.getTipoToken() == token.Type.IGUALDAD || n.getTipoToken() == token.Type.DESIGUALDAD) { if (!(n.hijos[0].getTipoDato() == token.DataType.INTEGER || n.hijos[0].getTipoDato() == token.DataType.REAL && n.hijos[1].getTipoDato() == token.DataType.INTEGER || n.hijos[1].getTipoDato() == token.DataType.REAL)) { TypeError(n, "Operacion no valida"); n.setTipoDato(token.DataType.ERROR); } else if (n.hijos[0].getTipoDato() != n.hijos[1].getTipoDato()) { TypeError(n, "Tipos de dato no coinciden"); n.setTipoDato(token.DataType.ERROR); } else { n.setTipoDato(token.DataType.BOOLEAN); } } if (n.getTipoToken() == token.Type.AND || n.getTipoToken() == token.Type.OR) { if (n.hijos[0].getTipoDato() != token.DataType.BOOLEAN || n.hijos[1].getTipoDato() != token.DataType.BOOLEAN) { TypeError(n, "Operacion no valida"); n.setTipoDato(token.DataType.ERROR); } else { n.setTipoDato(token.DataType.BOOLEAN); } } if (n.getTipoToken() == token.Type.NOT) { if (n.hijos[0].getTipoDato() != token.DataType.BOOLEAN) { TypeError(n, "Operacion no valida"); n.setTipoDato(token.DataType.ERROR); } else { n.setTipoDato(token.DataType.BOOLEAN); } } if (n.hermano != null) { TypeCheck(n.hermano); } }
private static Nodo ActualizarNodo(Nodo n) { Symtab.Variable aux = Symtab.GetVariable(n); n.setTipoDato(aux.tipo); return(n); }
public static List <string> tablaSi() { tablaSin = Symtab.tablaSi(); return(tablaSin); }
private void Click_compilar(object sender, EventArgs e) { if (rutaArchivo != null) { using (StreamWriter escritura = new StreamWriter(rutaArchivo)) { escritura.Write(cuadro.Text); } } else { if (guardar.ShowDialog() == DialogResult.OK) { rutaArchivo = guardar.FileName; using (StreamWriter escritura = new StreamWriter(guardar.FileName)) { escritura.Write(cuadro.Text); } } } string[] lineas = System.IO.File.ReadAllLines(rutaArchivo); //string cadenas ="+-{;}"; //Console.WriteLine("Coincidencias primer archivo: \t"); lexico analizador = new lexico(); Symtab.LimpiarTabla(); int lineaP = 1; foreach (string linea in lineas) { analizador.Analizado_Lexico(linea, lineaP); lineaP++; } analizador.obtenerTokens2(); LexicoTextBox.Text = analizador.tokensResultados(); analizador.obtenerTokens2E(); ErroresTextBox.Text = analizador.tokensResultadosE(); //Para el analizador sintactico if (analizador.tokensResultadosE() == null) { Sintactico analizadorSintactico = new Sintactico(analizador.obtenerTokens()); CodigoIntermedio CodigoInter = new CodigoIntermedio(); codigointermedio.Text = ""; Nodo arbol = new Nodo(); Semantico.limpiarSemantico(); arbol = analizadorSintactico.arbolSintactico(); //ErroresTextBox.Text = analizadorSintactico.getNodosArbol(arbol); Semantico.InsertarId(arbol); Semantico.TypeCheck(arbol); //ResulTextBox.Text = analizadorSintactico.getNodosArbol(arbol); //Arbol es el que utilizamos para enviarlo al TreeView arbolSintactico.Nodes.Clear(); arbolSemantico.Nodes.Clear(); TreeNode auxSintactico = arbolSintactico.Nodes.Add(arbol.getLexema()); TreeNode auxSemantico = arbolSemantico.Nodes.Add(arbol.getLexema()); CrearTreeview(null, auxSintactico, arbol); CrearTreeviewAtrib(null, auxSemantico, arbol); ErroresTextBox.Text += analizadorSintactico.erroresSintacticos() + Semantico.GetErroresSemantico(); ResulTextBox.Text = Symtab.GetSymtab(); //Semantico.TablaSemantico(); tablaSin = Semantico.tablaSi(); MostrarTabla(); //CodigoInter.CrearCodigoInter(null, auxSemantico, arbol); CodigoInter.CodeGen(arbol, null); resultadoCodigo = CodigoInter.extraerResultados(); for (int i = 0; i < resultadoCodigo.Count; i++) { String actual = resultadoCodigo.ElementAt(i); codigointermedio.Text += actual + "\n"; } } /* * //Programa para ejecutar el comando externo * string cadena = lanzaProceso(@".\Program.exe", rutaArchivo); * char caracter = '|'; * string[] resTokens = cadena.Split(caracter); * LexicoTextBox.Text = resTokens[0]; * ErroresTextBox.Text = resTokens[2]; */ }