public override void checkTipo(TablaSimbolos tabla) { if (!expr1.Tipo_Expr.Equals(NucleoLenguaje.tipoEntero) || !expr2.Tipo_Expr.Equals(NucleoLenguaje.tipoEntero)) SemantErrorReport.Instancia.semantError(this, "la operación menor_que no se puede aplicar a valores de tipo " + expr1.Tipo_Expr + " y " + expr2.Tipo_Expr); tipo_expr = NucleoLenguaje.tipoBool; }
public override void checkSemantica(TablaSimbolos tabla) { sentencias.checkSemantica(tabla); condicion.checkSemantica(tabla); //validar que la condición sea de tipo booleana if (!condicion.Tipo_Expr.Equals(NucleoLenguaje.tipoBool)) SemantErrorReport.Instancia.semantError(condicion, "la condición del \"repeat-until\" debe ser un valor de tipo _lógico"); }
public override void checkSemantica(TablaSimbolos tabla) { Object sym = tabla.buscar(nombre); checkTipo(tabla); if(sym==null) SemantErrorReport.Instancia.semantError(this, "la variable \""+nombre+"\" no ha sido inicializada"); else if(sym.GetType() != typeof(Variable)) //verificar que sea una nombre de variable SemantErrorReport.Instancia.semantError(this, "el identificador \""+nombre+"\" es inválido"); }
public TablaSimbolos copy() { TablaSimbolos table = new TablaSimbolos(); for (int i = 0; i < tbl.Count; i++) { table.crearAmbito(); table.tbl.Peek().Concat(tbl[i]); } return(table); }
public override void checkSemantica(TablaSimbolos tabla) { condicion.checkSemantica(tabla); //validar que la condición sea de tipo booleana if (!condicion.Tipo_Expr.Equals(NucleoLenguaje.tipoBool)) SemantErrorReport.Instancia.semantError(condicion, "la condición del \"if\" debe ser un valor de tipo _lógico"); entonces.checkSemantica(tabla); if (sino != null) sino.checkSemantica(tabla); }
private void instalarFuncBasicas() { //crear la tabla de simbolos tabla = new TablaSimbolos(); //agregar los métodos básicos a la tabla. List<FuncionDef> funs = NucleoLenguaje.Instancia.getFuncBasicas(); tabla.crearAmbito(); foreach(FuncionDef fun in funs){ tabla.agregarId(fun.Nombre, fun); } }
public override void checkSemantica(TablaSimbolos tabla) { //Chequear que si la variable existe, sea una variable Object sym = tabla.buscar(id.Nombre); if (sym!=null && sym.GetType() != typeof(Variable)) { SemantErrorReport.Instancia.semantError(id, "el identificador "+id.Nombre+" es inválido"); } expr.checkSemantica(tabla); //Agregar el id a la tabla de símbolos if(sym==null) tabla.agregarId(id.Nombre, id); id.checkTipo(tabla); //chequear el tipo del id y la expresión if (!id.Tipo_Expr.Equals(expr.Tipo_Expr)) SemantErrorReport.Instancia.semantError(id, "no se puede convertir valor de tipo "+expr.Tipo_Expr+" a tipo "+id.Tipo_Expr); }
public override void checkSemantica(TablaSimbolos tabla) { Object sym = tabla.buscar(id); bool exists = true, esVariable; //chequear que el método exista if(sym==null || sym.GetType() != typeof(FuncionDef)){ SemantErrorReport.Instancia.semantError(this, "no se encuentra la definición para la función \""+id+"\""); exists = false; } //chequear que los tipos de los paramétros se correspondan con los de la función if(exists){ FuncionDef f = (FuncionDef) sym; if(f.Parametros.getLongitud()!=lparams.getLongitud()) SemantErrorReport.Instancia.semantError(this, "la cantidad de paramétros no coincide con la definición de la función \""+id+"\""); else{ for(int i=0;i<lparams.getLongitud();i++){ Expresion param = lparams.getLista()[i]; //si el paramétro es una variable agregarlo a la tabla de simbolo esVariable = false; if(param.GetType() == typeof(Variable)){ if(tabla.buscar(((Variable)param).Nombre)==null) tabla.agregarId(((Variable)param).Nombre, param); esVariable = true; } param.checkSemantica(tabla); if(!param.Tipo_Expr.Equals(f.Parametros.getLista()[i].Tipo) || (f.Parametros.getLista()[i].EsDireccion && !esVariable)) SemantErrorReport.Instancia.semantError(param, "el tipo de paramétro no coincide con la definición de la función \""+id+"\""); } } } }
public TablaSimbolos copy() { TablaSimbolos table = new TablaSimbolos(); for (int i = 0; i < tbl.Count; i++) { table.crearAmbito(); table.tbl.Peek().Concat(tbl[i]); } return table; }
public void combinar(TablaSimbolos table) { Dictionary<SimboloAbstracto, Object> env = table.tbl.Peek(); env.Concat(tbl.Peek()); }
public void combinar(TablaSimbolos table) { Dictionary <SimboloAbstracto, Object> env = table.tbl.Peek(); env.Concat(tbl.Peek()); }
public override void checkTipo(TablaSimbolos tabla) { tipo_expr = NucleoLenguaje.tipoEntero; }
public override void checkSemantica(TablaSimbolos tabla) { expr1.checkSemantica(tabla); expr2.checkSemantica(tabla); checkTipo(tabla); }
public override void checkSemantica(TablaSimbolos tabla) { //TODO no existe verificacion semantica en este nodo }
public override void checkSemantica(TablaSimbolos tabla) { checkTipo(tabla); }
public abstract void checkSemantica(TablaSimbolos tabla);
public abstract void checkTipo(TablaSimbolos tabla);
public override void checkSemantica(TablaSimbolos tabla) { //Para cada sentencia del programa realizar el análisis semántico sentencias.checkSemantica(tabla); }