예제 #1
0
파일: Menor.cs 프로젝트: xiul/TinySharp
 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;
 }
예제 #2
0
        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");
        }
예제 #3
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");
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
            }
        }
예제 #7
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);
        }
예제 #8
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+"\"");
                    }
                }
            }
        }
예제 #9
0
        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;
        }
예제 #10
0
 public void combinar(TablaSimbolos table)
 {
     Dictionary<SimboloAbstracto, Object> env = table.tbl.Peek();
     env.Concat(tbl.Peek());
 }
예제 #11
0
        public void combinar(TablaSimbolos table)
        {
            Dictionary <SimboloAbstracto, Object> env = table.tbl.Peek();

            env.Concat(tbl.Peek());
        }
예제 #12
0
파일: Variable.cs 프로젝트: xiul/TinySharp
 public override void checkTipo(TablaSimbolos tabla)
 {
     tipo_expr = NucleoLenguaje.tipoEntero;
 }
예제 #13
0
파일: Menor.cs 프로젝트: xiul/TinySharp
 public override void checkSemantica(TablaSimbolos tabla)
 {
     expr1.checkSemantica(tabla);
     expr2.checkSemantica(tabla);
     checkTipo(tabla);
 }
예제 #14
0
 public override void checkSemantica(TablaSimbolos tabla)
 {
     //TODO no existe verificacion semantica en este nodo
 }
예제 #15
0
 public override void checkSemantica(TablaSimbolos tabla)
 {
     checkTipo(tabla);
 }
예제 #16
0
파일: NodoArbol.cs 프로젝트: xiul/TinySharp
 public abstract void checkSemantica(TablaSimbolos tabla);
예제 #17
0
파일: Expresion.cs 프로젝트: xiul/TinySharp
 public abstract void checkTipo(TablaSimbolos tabla);
예제 #18
0
파일: Programa.cs 프로젝트: xiul/TinySharp
 public override void checkSemantica(TablaSimbolos tabla)
 {
     //Para cada sentencia del programa realizar el análisis semántico
     sentencias.checkSemantica(tabla);
 }