class AnalizadorSemantico: def __init__(self, ast): self.ast = ast self.tabla_simbolos = {} self.errores = [] def analizar(self): for nodo in self.ast: self.analizar_instruccion(nodo) return { "variables_declaradas": self.tabla_simbolos, "errores_semanticos": self.errores } def analizar_instruccion(self, nodo): if nodo["type"] == "assign": tipo_valor = self.analizar_expresion(nodo["value"]) self.tabla_simbolos[nodo["var"]] = tipo_valor elif nodo["type"] == "if": tipo_condicion = self.analizar_expresion(nodo["condition"]) if tipo_condicion != "int": self.errores.append( f"Condición del IF debe ser de tipo int, pero se encontró '{tipo_condicion}'" ) for instr in nodo["body"]: self.analizar_instruccion(instr) def analizar_expresion(self, expr): if expr["type"] == "num": return "float" if "." in expr["value"] else "int" elif expr["type"] == "var": nombre = expr["value"] if nombre not in self.tabla_simbolos: self.errores.append(f"Variable '{nombre}' usada sin ser declarada.") return "error" return self.tabla_simbolos[nombre] elif expr["type"] == "binop": tipo_izq = self.analizar_expresion(expr["left"]) tipo_der = self.analizar_expresion(expr["right"]) if tipo_izq != tipo_der: self.errores.append(f"Tipos incompatibles: {tipo_izq} y {tipo_der}") return "error" return tipo_izq else: self.errores.append(f"Expresión no reconocida: {expr}") return "error"