예제 #1
0
파일: Variable.cs 프로젝트: xiul/TinySharp
        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");
        }
예제 #2
0
        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);
        }
예제 #3
0
        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+"\"");
                    }
                }
            }
        }