コード例 #1
0
        bool verificarParametros(LinkedList <Exp> valores, LinkedList <Simbolo> parametros, Ambito ent, AST arbol)
        {
            // Esto se agrego debido a que LinkedList no tiene metodo get(index) o ElementAt(index)
            IList param = new List <Simbolo>(parametros);
            IList vals  = new List <Exp>(valores);

            if (vals.Count == param.Count)
            {
                // La cantidad de valores y parametros es la correcta.

                /*
                 * Variables auxiliares que permitirán verificacion de tipos y carga de parametros
                 * al entorno local de la función.
                 */
                Simbolo sim_aux;
                string  id_aux;
                Tipos   tipoPar_aux;
                Tipos   tipoVal_aux;
                Exp     exp_aux;
                object  val_aux;

                for (int i = 0; i < parametros.Count; i++)
                {
                    sim_aux     = (Simbolo)param[i];
                    id_aux      = sim_aux.Id;
                    tipoPar_aux = sim_aux.Tipo;

                    exp_aux     = (Exp)vals[i];
                    tipoVal_aux = exp_aux.getTipo(ent, arbol);
                    val_aux     = exp_aux.getValorImplicito(ent, arbol);
                    if (tipoPar_aux == tipoVal_aux)
                    {
                        // Si los tipos corresponden se agregan los parametros con su respectivo valor.
                        ent.agregar(id_aux, new Simbolo(tipoPar_aux, id_aux, val_aux));
                    }
                    else
                    {
                        Console.WriteLine("Llamada a: " + id + ", El tipo de los parametros no coinciden con "
                                          + "el valor correspondiente utilizado en la llamada, Parametro:" + id_aux);
                        return(false);
                    }
                }
                return(true);
            }
            else
            {
                Console.WriteLine("Llamada a: " + id + "La cantidad de parametros no coincide");
            }
            return(false);
        }
コード例 #2
0
        public void codigoaEvaluar(string strCodigoaEvaluar)
        {
            //MessageBox.Show("" + codF);

            Analizadores.Analizador analizar = new Analizador(new Gramatica());
            ParseTree arbol = analizar.isValid(strCodigoaEvaluar);

            if (arbol != null)
            {
                ConstructorAst constAst = new ConstructorAst();
                AST            arbolAux = constAst.Analizar(arbol.Root);
                Ambito         global   = new Ambito(null);

                try {
                    if (arbolAux != null)
                    {
                        foreach (Instruccion inst in arbolAux.Instrucciones)
                        {
                            //if (inst is Funcion) {

                            //}
                            if (inst is Declaracion)
                            {
                                Declaracion declaracion = (Declaracion)inst;
                                declaracion.ejecutar(global, arbolAux);
                            }
                            //toca deficion clase
                        }

                        foreach (Instruccion ins in arbolAux.Instrucciones)
                        {
                            if (ins is Funcion)
                            {
                                Funcion funcion = (Funcion)ins;
                                global.agregar(funcion.Id, funcion);
                                foreach (NodoAST instruccion in funcion.LLInstrucciones)
                                {
                                    //if (instruccion is DefinicionStruct)
                                    //{
                                    //    DefinicionStruct crear = (DefinicionStruct)instruccion;
                                    //    crear.ejecutar(global, auxArbol);
                                    //}
                                }
                            }
                            if (ins is Declaracion)
                            {
                                Declaracion declaracion = (Declaracion)ins;
                                declaracion.ejecutar(global, arbolAux);
                            }
                            //if (ins is DefinicionStruct)
                            //{
                            //    DefinicionStruct crear = (DefinicionStruct)ins;
                            //    crear.ejecutar(global, auxArbol);
                            //}
                        }

                        foreach (Instruccion ins in arbolAux.Instrucciones)
                        {
                            if (ins is Principal)
                            {
                                Principal main = (Principal)ins;

                                Ambito local = new Ambito(global);

                                main.ejecutar(local, arbolAux);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Cadena invalida");
                    }
                }
                catch (Exception ex) {
                    MessageBox.Show(ex.ToString());
                }

                //analizar.parse(arbol, new PrimeraPasada());
                MessageBox.Show("Cadena Valida");
            }
            else
            {
                MessageBox.Show("No Valida");
            }
        }