public static void InsertarId(Nodo n) { if (n.getTipoToken() == token.Type.ID) { if (!Symtab.BuscarVariable(n)) { Symtab.AñadirVariable(n); } else { Symtab.Variable dato = Symtab.GetVariable(n); n.setTipoDato(dato.tipo); Symtab.ActualizarVariable(n); } } if (n.hijos[0] != null) { InsertarId(n.hijos[0]); } if (n.hijos[1] != null) { InsertarId(n.hijos[1]); } if (n.hijos[2] != null) { InsertarId(n.hijos[2]); } if (n.hermano != null) { InsertarId(n.hermano); } }
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 void ImprimirArbol(Nodo nodo) { if (nodo != null) { nodosArbol += $"Linea:{nodo.getLinea()}, Lexema:{nodo.getLexema()}, Token:{nodo.getTipoToken()}, Tipo:{nodo.getTipoDato()}" + Environment.NewLine;; ImprimirArbol(nodo.hijos[0]); ImprimirArbol(nodo.hijos[1]); ImprimirArbol(nodo.hijos[2]); ImprimirArbol(nodo.hermano); } }
public void CodeGen(Nodo n, Nodo padre) { if (n.getTipoToken() == token.Type.IF) { string ifLable = TempLabelGen(); if (n.hijos[0] != null) { CodeGen(n.hijos[0], n); } resultado.Add($"if_false {n.hijos[0].label} goto {ifLable}"); if (n.hijos[1] != null) { CodeGen(n.hijos[1], n); } resultado.Add($"label {ifLable}"); if (n.hijos[2] != null) { CodeGen(n.hijos[2], n); } } else if (n.getTipoToken() == token.Type.WHILE) { string whileLable1 = TempLabelGen(); string whileLable2 = TempLabelGen(); resultado.Add($"label {whileLable1}"); if (n.hijos[0] != null) { CodeGen(n.hijos[0], n); } resultado.Add($"if_false {n.hijos[0].label} goto {whileLable2}"); if (n.hijos[1] != null) { CodeGen(n.hijos[1], n); } resultado.Add($"goto {whileLable1}"); resultado.Add($"label {whileLable2}"); } else if (n.getTipoToken() == token.Type.DO) { string doLable = TempLabelGen(); resultado.Add($"label {doLable}"); if (n.hijos[0] != null) { CodeGen(n.hijos[0], n); } if (n.hijos[1] != null) { CodeGen(n.hijos[1], n); } resultado.Add($"if_false {n.hijos[1].label} goto {doLable}"); } else { if (n.hijos[0] != null) { CodeGen(n.hijos[0], n); } if (n.hijos[1] != null) { CodeGen(n.hijos[1], n); } if (n.hijos[2] != null) { CodeGen(n.hijos[2], n); } if (n.getTipoToken() == token.Type.ID || n.getTipoToken() == token.Type.NUM || n.getTipoToken() == token.Type.TRUE || n.getTipoToken() == token.Type.FALSE) { n.label = n.getLexema(); } if (n.getTipoToken() == token.Type.CONDICION) { n.label = n.hijos[0].label; } if (padre != null && padre.getTipoToken() == token.Type.DATATYPE) { resultado.Add($"{padre.getTipoDato()} {n.getLexema()}"); } if (n.getTipoToken() == token.Type.SUMA || n.getTipoToken() == token.Type.RESTA || n.getTipoToken() == token.Type.MULTIPLICACION || n.getTipoToken() == token.Type.DIVISION || 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 || n.getTipoToken() == token.Type.AND || n.getTipoToken() == token.Type.OR) { n.label = TempVarGen(); resultado.Add($"{n.label} = {n.hijos[0].label} {n.getLexema()} {n.hijos[1].label}"); } if (n.getTipoToken() == token.Type.NOT) { n.label = TempVarGen(); resultado.Add($"{n.label} = {n.getLexema()} {n.hijos[0].label}"); } if (n.getTipoToken() == token.Type.ASIGNACION) { resultado.Add($"{n.hijos[0].label} = {n.hijos[1].label}"); } if (n.getTipoToken() == token.Type.READ || n.getTipoToken() == token.Type.WRITE) { resultado.Add($"{n.getTipoToken()} {n.hijos[0].label}"); } } if (n.hermano != null) { CodeGen(n.hermano, padre); } }