public DefLocal(Pila p, DefVar v)
        {
            p.pop();
            p.pop();

            variables = v;
        }
        public Definicion(Pila p, DefVar v)
        {
            p.pop();
            p.pop();

            variables = v;
        }
Beispiel #3
0
        public void arbolSintactico(String regla, String simb)
        {
            Termino nuevoTermino;

            switch (regla)
            {
            case "R1":
                Programa prog = new Programa(pila, listaDefiniciones);
                prog.muestra(arbolSint);
                break;

            case "R30":
                pila.pop();
                pila.pop();
                break;

            case "R3":
                Definiciones nuevaDef = new Definiciones(pila, listaDefinicion.Last <Definicion>());
                listaDefiniciones.Add(nuevaDef);
                Definicion auxDef = listaDefinicion.Last <Definicion>();
                listaDefinicion.Remove(auxDef);
                break;

            case "R4":
                Definicion defVariable = new Definicion(pila, listaVariables.Last <DefVar>());
                listaDefinicion.Add(defVariable);
                break;

            case "R5":
                Definicion def = new Definicion(pila, listaFunciones.Last <DefFunc>());
                listaDefinicion.Add(def);
                break;

            case "R6":
                DefVar arbol = new DefVar(pila);
                listaVariables.Add(arbol);
                break;

            case "R9":
                DefFunc nuevaFuncion = new DefFunc(pila, listaParam, bloqFuncs.Last <BloqFunc>());
                listaFunciones.Add(nuevaFuncion);
                listaParam       = new List <Parametros>();
                listaExpresion   = new List <Expresion>();
                listaExpresiones = new List <Expresion>();
                listaDefLocal    = new List <DefLocal>();
                listaDefLocales  = new List <DefLocales>();
                break;

            case "R10":
                listaParam.Add(null);
                break;

            case "R11":
                pila.pop();
                pila.pop();
                Parametros nuevoParametro = new Parametros(pila);
                listaParam.Add(nuevoParametro);
                break;

            case "R12":
                break;

            case "R13":
                pila.pop();
                pila.pop();
                Parametros nuevoParametros = new Parametros(pila);
                listaParam.Add(nuevoParametros);
                pila.pop();
                pila.pop();
                break;

            case "R14":
                BloqFunc bFunc = new BloqFunc(pila, listaDefLocales.Last <DefLocales>());
                bloqFuncs.Add(bFunc);
                break;

            case "R16":
                DefLocales locales = new DefLocales(pila, listaDefLocal);
                listaDefLocales.Add(locales);
                break;

            case "R17":
                DefLocal nuevaVar = new DefLocal(pila, listaVariables.Last <DefVar>());
                listaDefLocal.Add(nuevaVar);
                break;

            case "R18":
                DefLocal defSentencia = new DefLocal(pila, listaSentencias.Last <Sentencia>());
                listaDefLocal.Add(defSentencia);
                break;

            case "R20":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();
                break;

            case "R21":
                Expresion aux;
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();
                if (listaExpresion.Count > 0)
                {
                    Sentencia nuevaSentencia = new Sentencia(pila, listaExpresion.Last <Expresion>());
                    listaSentencias.Add(nuevaSentencia);
                    if (nuevaSentencia.validar(listaVariables) == false)
                    {
                        agregarErrorSemantico("R21", nuevaSentencia.id);
                    }
                    aux = listaExpresion.Last <Expresion>();
                    listaExpresion.Remove(aux);
                }
                else
                {
                    Sentencia nuevaSentencia = new Sentencia(pila, listaExpresiones.Last <Expresion>());
                    listaSentencias.Add(nuevaSentencia);
                }
                break;

            case "R23":
                for (int i = 0; i < 10; i++)
                {
                    pila.pop();
                }
                break;

            case "R24":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();
                Sentencia sentReturn = new Sentencia(pila, listaExpresion.Last <Expresion>());
                listaSentencias.Add(sentReturn);
                aux = listaExpresion.Last <Expresion>();
                listaExpresion.Remove(aux);
                break;

            case "R28":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();
                break;

            case "R32":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                listaArgumentos.Add(listaExpresiones[listaExpresiones.Count - 2]);
                break;

            case "R34":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                listaArgumentos.Add(listaExpresiones.Last <Expresion>());
                break;

            case "R35":
                Termino nuevoTermFunc = new Termino(pila, listaLlamadaFunc.Last <LlamadaFunc>());
                listaTerminos.Add(nuevoTermFunc);
                break;

            case "R36":
            case "R37":
            case "R38":
                nuevoTermino = new Termino(pila);
                listaTerminos.Add(nuevoTermino);
                break;

            case "R40":
                Argumentos  args        = new Argumentos(listaArgumentos);
                LlamadaFunc llamadaFunc = new LlamadaFunc(pila, args);
                if (llamadaFunc.comparar(listaFunciones) == false)
                {
                    agregarErrorSemantico("R40", llamadaFunc.id);
                }
                listaLlamadaFunc.Add(llamadaFunc);
                break;

            case "R47":

                Expresion nuevaExpresion = new Expresion(pila, listaExpresiones);
                listaExpresion.Add(nuevaExpresion);
                break;

            case "R48":
                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();

                pila.pop();
                pila.pop();
                break;

            case "R52":
                Expresion nuevaExp = new Expresion(pila, listaTerminos.Last <Termino>());
                listaExpresiones.Add(nuevaExp);
                break;

            default:
                break;
            }
        }