示例#1
0
 public void put(string key, Tipo tipo)
 {
     if (!tablaSimbolos.ContainsKey(key))
         tablaSimbolos.Add(key, tipo);
     else
         throw new Exception("La variable \"" + key + "\" ya fue declarada. EnvT.");
 }
示例#2
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Cadena;
 }
示例#3
0
 public abstract bool esEquivalente(Tipo t);
示例#4
0
        public EnumerationVariableDeclaration(string enumName, string enumVarName, Tipo tipoenum, Valor valEnum)
        {
            enumerationName = enumName;
            enumerationVarName = enumVarName;
            tipo = tipoenum;

            valorEnum = valEnum;
            entornoValoresActual = Parser.entornoValores;
        }
示例#5
0
        Sentence function_declaration(Tipo retorno, string id)
        {
            EnvTypes savedEnvTypes = entornoTipos;
            entornoTipos = new EnvTypes(entornoTipos);

            //EnvValues savedEnvValues = entornoValores;
            //entornoValores = new EnvValues(entornoValores);
            EnvValues savedEnvValues = Parser.pilaValores.Peek();
            Parser.pilaValores.Push(new EnvValues(Parser.pilaValores.Peek()));

            match("(");
            Dictionary<string,Tipo> paramsTypeList = parameter_type_list();
            match(")");

            FunctionDefinition funcDefinition = new FunctionDefinition();
            funcionActual = funcDefinition;

            Sentence compoundStmnt = function_definition();

            funcDefinition.init(id, retorno, compoundStmnt);
            entornoTipos = savedEnvTypes;
            entornoValores = savedEnvValues;

            Parser.pilaValores.Pop();

            Funcion funcion = new Funcion(retorno, paramsTypeList);
            entornoTipos.put(id, funcion);

            ValorFuncion funcionVal = new ValorFuncion(funcDefinition);
            //entornoValores.put(id, funcionVal);
            Parser.pilaValores.Peek().put(id, funcionVal);

            funcionActual = null;

            if (id == "main")
            {
                main = funcDefinition;
            }

            return funcDefinition;
        }
示例#6
0
        VariableDeclarations variable_declarator(VariableDeclarator primerVariable, Tipo tipoVariables)
        {
            primerVariable.initialization = variable_initializer();//primer variable viene sin inicializador

            entornoTipos.put(primerVariable.declaration.id, primerVariable.declaration.tipo);//tablasimbolos

            VariableDeclaration listaDeclaracionVariables = variable_declarators(primerVariable, tipoVariables);

            return new VariableDeclarations(listaDeclaracionVariables);
        }
示例#7
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Entero;
 }
示例#8
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Void;
 }
示例#9
0
 public Tipo validarSemanticohelper(Tipo t)
 {
     if (t is Arreglo)
         return validarSemanticohelper(((Arreglo)t).tipoArreglo);
     else
         return t;
 }
示例#10
0
 public void init(string nombreFuncion, Tipo ret, Sentence cpStmnt)
 {
     idFuncion = nombreFuncion;
     Tiporetorno = ret;
     compoundStatement = cpStmnt;
     entornoTiposLocal = Parser.entornoTipos;
 }
示例#11
0
        public FunctionDefinition(string nombreFuncion, Tipo ret, Sentence cpStmnt)
        {
            idFuncion = nombreFuncion;
            Tiporetorno = ret;
            compoundStatement = cpStmnt;
            entornoTiposLocal = Parser.entornoTipos;
            entornoValoresLocal = Parser.entornoValores;

            ValorRetorno = null;
            returned = false;
        }
示例#12
0
        public override bool esEquivalente(Tipo t)
        {
            if (t is Funcion)
            {
                Funcion func = (Funcion)t;

                if (!tipoRetorno.esEquivalente(func.tipoRetorno))
                    return false;

                //for (int x = 0; x < )

                return true;
                //return Parametros.esEquivalente(func.Parametros);
            }
            else
                return false;
        }
示例#13
0
 public Funcion(Tipo retorno, Dictionary<string, Tipo> parametros)
 {
     tipoRetorno = retorno;
     Parametros = parametros;
 }
示例#14
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Flotante;
 }
示例#15
0
 public static Valor getDefaultValue(Tipo tipo)
 {
     if (tipo is Arreglo)
     {
         return getValorArreglo((Arreglo)tipo);
     }
     else
         return new ValorDefault();
 }
示例#16
0
 public VariableSubDeclarator(Tipo typevar, string idvar)
 {
     tipo = typevar;
     id = idvar;
 }
示例#17
0
 public Arreglo(Tipo tipo, int tam)
 {
     tipoArreglo = tipo;
     size = tam;
 }
示例#18
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Caracter;
 }
示例#19
0
        public override bool esEquivalente(Tipo t)
        {
            if (t is Arreglo)
            {
                Arreglo array = (Arreglo)t;

                if (!tipoArreglo.esEquivalente(array.tipoArreglo))
                    return false;

                return size == array.size;
            }
            else
                return false;
        }
示例#20
0
        Tipo variable_array(Tipo tipoArreglo)
        {
            if (peek("["))
            {
                match("[");
                //Expr sizeExpr = expr();
                int ind;

                bool parseo = Int32.TryParse(currentToken.Lexema,out ind);
                if (parseo == false)
                    throw new Exception("Error al parsear la cadena a entero currentToken:\"" + currentToken.Lexema + "\".");

                int sizeExpr = ind;
                match(TokenType.INTEGER_LITERAL);
                match("]");

                Tipo tipoArreglo2 = variable_array(tipoArreglo);

                Arreglo array_t = new Arreglo(tipoArreglo2, sizeExpr);
                //array_t.isReference = true;
                return array_t;
            } else
                return tipoArreglo;//null
        }
示例#21
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Booleano;
 }
示例#22
0
        VariableDeclaration variable_declarators(VariableDeclaration beforeDeclaration, Tipo tipoVariables)
        {
            if (peek(","))
            {
                match(",");

                string idVariable = direct_variable_declarator();
                Tipo tipoVariable = variable_array(tipoVariables);
                Initializers init = variable_initializer();

                entornoTipos.put(idVariable, tipoVariable);//tablasimbolos

                VariableSubDeclarator variableActual = new VariableSubDeclarator(tipoVariable, idVariable);
                VariableDeclarator actualDeclaration = new VariableDeclarator(variableActual, init);
                VariableDeclarators variableDeclarators = new VariableDeclarators(beforeDeclaration, actualDeclaration);

                return variable_declarators(variableDeclarators, tipoVariables);
            }
            else
                return beforeDeclaration;//null
        }
示例#23
0
        public override bool esEquivalente(Tipo t)
        {
            if (t is Registro)
            {
                Registro r = (Registro)t;

                if (entornoTiposStruct.tablaSimbolos.Count == r.entornoTiposStruct.tablaSimbolos.Count)
                {
                    for (int i = 0; i < entornoTiposStruct.tablaSimbolos.Count; i++)
                    {
                        Tipo miCampo = entornoTiposStruct.tablaSimbolos.ElementAt(i).Value;
                        Tipo otroCampo = r.entornoTiposStruct.tablaSimbolos.ElementAt(i).Value;

                        if (!(miCampo.esEquivalente(otroCampo)))
                            return false;
                    }
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }
示例#24
0
 public StructVariableDeclaration(string strid,string strvarname, Tipo tipostr, Valor valRegistro)
 {
     strId = strid;
     strVarId = strvarname;
     tipo = tipostr;
     valorRegistro = valRegistro;
 }
示例#25
0
 public override bool esEquivalente(Tipo t)
 {
     return t is Enumeracion;
 }