コード例 #1
0
ファイル: pruebaSemantico.cs プロジェクト: WGPQ/CompilerWCL
        public void compararTipos(Atributos atr1, Atributos atr2)
        {
            int t1, t2;

            if (atr1.tipo == 0) // los dos son identificadores
            {
                t1        = buscarTipoTDS(atr1.valor.ToString());
                atr1.tipo = t1;
            }
            else
            {
                t1 = atr1.tipo;
            }
            if (atr2.tipo == 0)
            {
                t2        = buscarTipoTDS(atr2.valor.ToString());
                atr2.tipo = t2;
            }
            else
            {
                t2 = atr2.tipo;
            }
            if (t1 > 2 || t2 > 2)
            {
                MessageBox.Show("ERROR: no se puede realizar operaciones con char, string o bool");
            }
            else
            {
                if (t1 != t2)
                {
                    MessageBox.Show("ERROR TIPOS NO COMPATIBLES!!");
                    //mensaje de error tipos no compatibles
                }
            }
        }
コード例 #2
0
ファイル: pruebaSemantico.cs プロジェクト: WGPQ/CompilerWCL
        /**
         * Funcion principal del analizador semantico para la generación de codigo
         *
         */
        public void generar_codigoCuadruplo()
        {
            int       num_regla = 0;
            Atributos atrp      = null;
            Atributos atr1      = null;
            Atributos atr2      = null;
            int       posTS     = 0;
            int       tipoDato  = -1;
            int       tipoValor = -1;

            imprimir("regla\tdato\ttipo\tpIzq\tpDer");
            foreach (Regla_produccion r in listaReglasReconocidas)
            {
                imprimir(r.numero_regla +
                         "\t" + r.dato + "\t" + r.tipo + "\t" + r.part_izquierda + "\t" + r.part_derecha);
            }

            foreach (TDS t in listaTDS)
            {
                imprimir("name: " + t.nametk + " size: " + t.size + " type: " + t.type + " value" + t.value);
            }

            for (int i = 0; i < this.listaReglasReconocidas.Count; i++)
            {
                num_regla = this.listaReglasReconocidas[i].numero_regla;
                if (num_regla == 56)
                {
                }
                switch (num_regla)
                {
                case 1:
                    break;

                case 2:
                    break;

                case 3:    // D -> U : <declarar> -> <undeclare>
                           /* atrp = new Atributos();
                            * atrp = pilaSemantica.Pop();
                            * atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                            * atrp.nombre = "Declare";
                            * pilaSemantica.Push(atrp);*/
                    break;

                case 4:
                    break;

                case 5:
                    tipoDato = tipoDatoDeclarado(listaReglasReconocidas[i].dato.ToString());
                    break;

                case 6:
                    tipoDato = tipoDatoDeclarado(listaReglasReconocidas[i].dato.ToString());
                    break;

                case 7:
                    tipoDato = tipoDatoDeclarado(listaReglasReconocidas[i].dato.ToString());
                    break;

                case 8:
                    tipoDato = tipoDatoDeclarado(listaReglasReconocidas[i].dato.ToString());
                    break;

                case 9:
                    tipoDato = tipoDatoDeclarado(listaReglasReconocidas[i].dato.ToString());
                    break;

                case 10:
                    break;

                case 11:
                    break;

                case 12:
                    tipoValor = tipoDatoIdentificado(listaReglasReconocidas[i].dato);
                    if (resultadoAsigne(tipoDato, tipoValor, listaReglasReconocidas[i].dato))
                    {
                        listaTDS[posTS].value = listaReglasReconocidas[i].dato;
                    }
                    posTS++;
                    break;

                case 13:     // false
                    tipoValor = tipoDatoIdentificado(listaReglasReconocidas[i].dato);
                    if (resultadoAsigne(tipoDato, tipoValor, listaReglasReconocidas[i].dato))
                    {
                        listaTDS[posTS].value = listaReglasReconocidas[i].dato;
                    }
                    posTS++;
                    break;

                case 14:     // true
                    tipoValor = tipoDatoIdentificado(listaReglasReconocidas[i].dato);
                    if (resultadoAsigne(tipoDato, tipoValor, listaReglasReconocidas[i].dato))
                    {
                        listaTDS[posTS].value = listaReglasReconocidas[i].dato;
                    }
                    posTS++;
                    break;

                case 15:     // N -> _ <inicializa> -> _
                    posTS++; // incremento x q es un identifiacdor sin declare
                    break;

                case 16:    // I -> X : <instrucciones> -> <instruccion>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instrucciones";
                    pilaSemantica.Push(atrp);
                    break;

                case 17:
                    break;

                case 18:    // X -> Y : <instruccion> -> <if>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 19:    // X -> W : <instruccion> -> <while>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 20:    // X->S : <instrucción> -> <for>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 21:    // X->V : <instrucción> -> <escribir>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 22:    // X->R : <instrucción> -> <leer>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 23:     // X -> O : <instruccion> -> <do>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 24:     // X->M : <instrucción> -> <incremento>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 25:     // X -> A : <instruccion> -> <asigna>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 26:
                    break;

                case 27:
                    break;

                case 28:
                    break;

                case 29:
                    break;

                case 30:
                    break;

                case 31:
                    break;

                case 32:
                    break;

                case 33:
                    break;

                case 34:
                    break;

                case 35:
                    break;

                case 36:
                    break;

                case 37:
                    break;

                case 38:
                    break;

                case 39:

                    break;

                case 40:
                    break;

                case 41:
                    break;

                case 42:
                    break;

                case 43:
                    break;

                case 44:
                    break;

                case 45:
                    break;

                case 46:
                    break;

                case 47:
                    break;

                case 48:
                    break;

                case 49:     //E->E + T : <expresion> -> <expresion> + <termino>
                    atrp = new Atributos();
                    atr1 = new Atributos();
                    atr2 = new Atributos();
                    atr1 = pilaSemantica.Pop();    //esto es igual a lo que tengo de factor
                    atr2 = pilaSemantica.Pop();    // esto es igual a termino
                    compararTipos(atr1, atr2);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = demeTemporal(atr1.tipo);
                    Gen("+", atr1.valor.ToString(), atr2.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    pilaSemantica.Push(atrp);
                    break;

                case 50:     // E->E - T : <expresion> -> <expresion> - <termino>
                    atrp = new Atributos();
                    atr1 = new Atributos();
                    atr2 = new Atributos();
                    atr1 = pilaSemantica.Pop();    //esto es igual a lo que tengo de factor
                    atr2 = pilaSemantica.Pop();    // esto es igual a termino
                    compararTipos(atr1, atr2);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = demeTemporal(atr1.tipo);
                    Gen("-", atr1.valor.ToString(), atr2.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    pilaSemantica.Push(atrp);
                    break;

                case 51:     // E-->T : <expresion> --> <termino>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    pilaSemantica.Push(atrp);
                    break;

                case 52:    //T-> T*F <termino>--> <termino> * <factor>
                    atrp = new Atributos();
                    atr1 = new Atributos();
                    atr2 = new Atributos();

                    atr1 = pilaSemantica.Pop();
                    atr2 = pilaSemantica.Pop();

                    // if (buscartipoTDS(atributosDePila1.valor.ToString()) != atributosDePila2.valor.ToString()))
                    //{
                    //mensaje de error no compatibñle
                    //}
                    compararTipos(atr1, atr2);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = demeTemporal(atr1.tipo);
                    Gen("*", atr1.valor.ToString(), atr2.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 53:     //T-> T/F <termino>--> <termino> / <factor>
                    atrp = new Atributos();
                    atr1 = new Atributos();
                    atr2 = new Atributos();

                    atr1 = pilaSemantica.Pop();
                    atr2 = pilaSemantica.Pop();


                    // if (buscartipoTDS(atributosDePila1.valor.ToString()) != atributosDePila2.valor.ToString()))
                    //{
                    //mensaje de error no compatibñle
                    //}
                    compararTipos(atr1, atr2);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = demeTemporal(atr1.tipo);
                    Gen("/", atr1.valor.ToString(), atr2.valor.ToString(), demeTemporal(0));
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 54:    //T-> T^F <termino>--> <termino> ^ <factor>
                    atrp = new Atributos();
                    atr1 = new Atributos();
                    atr2 = new Atributos();

                    atr1 = pilaSemantica.Pop();     //esto es igual a lo que tengo de factor
                    atr2 = pilaSemantica.Pop();     // esto es igual a termino

                    // if (buscartipoTDS(atributosDePila1.valor.ToString()) != atributosDePila2.valor.ToString()))
                    //{
                    //mensaje de error no compatibñle
                    //}
                    compararTipos(atr1, atr2);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = demeTemporal(atr1.tipo);
                    Gen("^", atr1.valor.ToString(), atr2.valor.ToString(), demeTemporal(0));
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 55:    // T -> F : <termino> -> <factor>
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 56:     // F -> i : <factor> -> identificador
                    atrp             = new Atributos();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.valor       = listaReglasReconocidas[i].dato;
                    pilaSemantica.Push(atrp);
                    break;

                case 57:    // F -> (E) : < factor > -> < expresion >
                    atrp             = new Atributos();
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    pilaSemantica.Push(atrp);
                    break;

                case 58:     // F -> a : <factor> -> literal
                    atrp             = new Atributos();
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.valor       = listaReglasReconocidas[i].dato;
                    atrp.tipo        = tipoVariable(listaReglasReconocidas[i].tipo); // obtengo el tipo de la variable
                    pilaSemantica.Push(atrp);
                    break;

                case 59:     // F -> v : <factor> -> true
                    atrp             = new Atributos();
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.tipo        = 5;
                    atrp.valor       = true;
                    pilaSemantica.Push(atrp);
                    break;

                case 60:     // F -> f : <factor> -> falso
                    atrp             = new Atributos();
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.tipo        = 5;
                    atrp.valor       = false;
                    pilaSemantica.Push(atrp);
                    break;

                default:
                    break;
                }
            }
            imprimir("op" + "\top1" + "\top2" + "\tres");
            foreach (Cuadruplos c in list_codigo_intermedio)
            {
                imprimir(c.operador + "\t" + c.operando_1 + "\t" + c.operando_2 + "\t" + c.resultado);
            }
        }
コード例 #3
0
ファイル: Semantico_srl.cs プロジェクト: WGPQ/CompilerWCL
        /**
         * Funcion principal del analizador semantico para la generación de codigo
         *
         */
        public void generar_codigoCuadruplo()
        {
            int       num_regla = 0;
            Atributos atrp      = null;
            Atributos atr1      = null;
            Atributos atr2      = null;
            Atributos atr3      = null;

            imprimir("regla\tdato\ttipo\tpIzq\tpDer");
            foreach (Regla_produccion r in listaReglasReconocidas)
            {
                imprimir(r.numero_regla +
                         "\t" + r.dato + "\t" + r.tipo + "\t" + r.part_izquierda + "\t" + r.part_derecha);
            }

            foreach (TDS t in listaTDS)
            {
                imprimir("name: " + t.nametk + " size: " + t.size + " type: " + t.type + " value" + t.value);
            }

            for (int i = 0; i < this.listaReglasReconocidas.Count; i++)
            {
                atrp      = new Atributos();
                atr1      = new Atributos();
                atr2      = new Atributos();
                atr3      = new Atributos();
                num_regla = this.listaReglasReconocidas[i].numero_regla;
                if (num_regla == 49)
                {
                }
                switch (num_regla)
                {
                case 1:
                    break;

                case 2:     //solo DE PRUEBA
                /*atrp = pilaSemantica.Pop();
                 * atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                 * atrp.nombre = "Declare";
                 * pilaSemantica.Push(atrp);
                 * break;*/

                case 3:    // D -> U : <declarar> -> <undeclare>
                //atrp = new Atributos();

                /*atrp = pilaSemantica.Pop();
                 * atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                 * atrp.nombre = "Declare";
                 * pilaSemantica.Push(atrp);*/

                /*atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                 * atrp.nombre = "declarar";
                 * pilaSemantica.Push(atrp);
                 * break;*/

                case 4:
                    break;

                case 5:
                    break;

                case 6:
                    break;

                case 7:
                    break;

                case 8:
                    break;

                case 9:
                    break;

                case 10:
                    break;

                case 11:
                    break;

                case 12:
                    break;

                case 13:
                    break;

                case 14:
                    break;

                case 15:
                    break;

                case 16:    // I -> X : <instrucciones> -> <instruccion>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instrucciones";
                    pilaSemantica.Push(atrp);
                    break;

                case 17:                        // I->XI : <instrucciones> -> <instrucción><instrucciones>
                    atr2 = pilaSemantica.Pop(); //aqui esta el valor del no terminal de I
                    atr1 = pilaSemantica.Pop(); //aqui esta el valor del no terminal de X

                    atrp.principio   = atr1.principio;
                    atrp.siguiente   = atr2.siguiente;
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instrucciones";
                    pilaSemantica.Push(atrp);
                    break;

                case 18:    // X -> Y : <instruccion> -> <if>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 19:    // X -> W : <instruccion> -> <while>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 20:    // X->S : <instrucción> -> <for>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 21:    // X->V : <instrucción> -> <escribir>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 22:    // X->R : <instrucción> -> <leer>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 23:     // X -> O : <instruccion> -> <do>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 24:     // X->M : <instrucción> -> <incremento>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 25:     // X -> A : <instruccion> -> <asigna>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Instruccion";
                    pilaSemantica.Push(atrp);
                    break;

                case 26:
                    break;

                case 27:                        // Y --> q (Z){I}Q  :  <if> -> if (<condicion>) {<instruciones>} <else>
                    atr3 = pilaSemantica.Pop(); // caso Q
                    atr2 = pilaSemantica.Pop(); // caso I
                    atr1 = pilaSemantica.Pop(); // caso Z

                    atrp.principio = atr1.principio;
                    backPatch(atr2.principio, atr1.list_verdaderos);
                    if (atr3.principio == 0)
                    {
                        atrp.siguiente = atr2.siguiente;
                        backPatch(atr2.siguiente, atr1.list_falsos);
                    }
                    else
                    {
                        backPatch(atr3.principio, atr1.list_falsos);
                        atrp.siguiente = atr3.siguiente;
                    }
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "If";
                    pilaSemantica.Push(atrp);
                    break;

                case 28:     // Q --> m {I}   :  <else> -> continue {<instrucciones>}
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Else";
                    pilaSemantica.Push(atrp);
                    break;

                case 29:     // Q--> vacio : <else> -> vacio
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Else";
                    atrp.principio   = 0;
                    atrp.siguiente   = 0;
                    pilaSemantica.Push(atrp);

                    break;

                case 30:                        // W->x(Z){I} : <while> -> while (<condición>){<instrucciones>}
                    atr2 = pilaSemantica.Pop(); //aqui esta el valor del no terminal de I
                    atr1 = pilaSemantica.Pop(); //aqui esta el valor del no terminal de Z

                    backPatch(atr1.siguiente, atr1.list_verdaderos);
                    atrp.principio = atr2.principio;
                    atrp.siguiente = Next() + 1;
                    Gen(null, null, null, "Goto: " + atr1.principio);
                    backPatch(atrp.siguiente, atr1.list_falsos);
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "While";
                    pilaSemantica.Push(atrp);
                    break;

                case 31:


                    break;

                case 32:

                    break;

                case 33:
                    break;

                case 34:
                    break;

                case 35:
                    break;

                case 36:
                    break;

                case 37:
                    break;

                case 38:
                    break;

                case 39:     // A->i:E;     : <asigna> -> identificador := <expresión>
                    atr1           = pilaSemantica.Pop();
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    atrp.valor     = listaReglasReconocidas[i].dato;
                    compararTipos(atrp, atr1);
                    Gen(":=", atr1.valor.ToString(), null, atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Asigna";
                    //atrp.principio = atr1.principio;
                    atrp.tipo = atr1.tipo;
                    pilaSemantica.Push(atrp);
                    break;

                case 40:                        //Z -> E B E   :  <condicion> -> <expresion><operel><expresion>
                    atr2 = pilaSemantica.Pop(); // E1
                    atr3 = pilaSemantica.Pop(); // B
                    atr1 = pilaSemantica.Pop(); // E2

                    //ANALIZO EL TIPO DE OPERADOR QUE RECIBO
                    if (atr3.valor.ToString() == "||" || atr3.valor.ToString() == "&&")
                    {
                        if (atr1.principio == 0)
                        {
                            atr1.principio       = Next();
                            atr1.list_verdaderos = make_list(atr1.principio);
                            Gen("if", atr1.valor.ToString(), null, "Goto: ");
                            atr1.siguiente   = Next();
                            atr1.list_falsos = make_list(atr1.siguiente);
                            Gen(null, null, null, "Goto: ");
                            atr1.siguiente++;
                        }
                        if (atr2.principio == 0)
                        {
                            atr2.principio       = Next();
                            atr2.list_verdaderos = make_list(atr2.principio);
                            Gen("if", atr2.valor.ToString(), null, "Goto: ");
                            atr2.siguiente   = Next();
                            atr2.list_falsos = make_list(atr2.siguiente);
                            Gen(null, null, null, "Goto: ");
                            atr2.siguiente++;
                        }
                        if (atr3.valor.ToString() == "||")
                        {
                            //voy a hacer codigo para el OR
                            atrp.principio       = atr1.principio;
                            atrp.siguiente       = atr2.siguiente;
                            atrp.list_verdaderos = merge(atr1.list_verdaderos, atr2.list_verdaderos);
                            atrp.list_falsos     = atr2.list_falsos;
                            backPatch(atr1.siguiente, atr1.list_falsos);     // ****
                            pilaSemantica.Push(atrp);
                        }

                        if (atr3.valor.ToString() == "&&")
                        {
                            //voy a generar codigo para el AND
                            atrp.principio       = atr1.principio;
                            atrp.siguiente       = atr2.siguiente;
                            atrp.list_verdaderos = atr2.list_verdaderos;
                            atrp.list_falsos     = merge(atr1.list_falsos, atr2.list_falsos);
                            backPatch(atr2.principio, atr1.list_verdaderos);
                            pilaSemantica.Push(atrp);
                        }
                    }
                    else
                    {
                        //TODOS LOS OTROS OPERADORES
                        atrp.principio       = Next();
                        atrp.list_verdaderos = make_list(atrp.principio);
                        Gen(atr3.valor.ToString(), atr1.valor.ToString(), atr2.valor.ToString(), "Goto: ");
                        atrp.siguiente   = Next();
                        atrp.list_falsos = make_list(atrp.siguiente);
                        Gen(null, null, null, "Goto: ");
                        atrp.siguiente++;
                        pilaSemantica.Push(atrp);
                    }
                    break;

                case 41:     // B -> | : <operel> -> ||
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "||";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 42:     // B -> &  : <operel> -> &&
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "&&";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 43:     // B -> #  : <operel> -> <>
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "<>";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 44:     // B -> >  : <operel> -> >
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = ">";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 45:     // B -> <  : <operel> -> <
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "<";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 46:     // B -> $  : <operel> -> >=
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = ">=";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 47:     // B -> %  : <operel> -> <=
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "<=";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 48:     // B -> =  : <operel> -> =
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Operel";
                    atrp.valor       = "=";
                    atrp.tipo        = 5;
                    pilaSemantica.Push(atrp);
                    break;

                case 49:                        //E->E + T : <expresion> -> <expresion> + <termino>
                    atr2 = pilaSemantica.Pop(); //esto es igual a lo que tengo termino T
                    atr1 = pilaSemantica.Pop(); // esto es igual a expresion  E
                    compararTipos(atr2, atr1);

                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    if (atr2.principio != 0)
                    {
                        atrp.principio = atr2.principio;
                    }

                    atrp.valor = demeTemporal(atr2.tipo);
                    Gen("+", atr2.valor.ToString(), atr1.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    //atrp.principio = atr2.principio;
                    pilaSemantica.Push(atrp);
                    break;

                case 50:                        // E->E - T : <expresion> -> <expresion> - <termino>
                    atr2 = pilaSemantica.Pop(); //esto es igual a lo que tengo termino T
                    atr1 = pilaSemantica.Pop(); // esto es igual a expresion  E
                    compararTipos(atr2, atr1);
                    //atrp.principio = Next();

                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    if (atr2.principio != 0)
                    {
                        atrp.principio = atr2.principio;
                    }

                    atrp.valor = demeTemporal(atr2.tipo);
                    Gen("-", atr2.valor.ToString(), atr1.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    //atrp.principio = atr2.principio;
                    pilaSemantica.Push(atrp);
                    break;

                case 51:     // E-->T : <expresion> --> <termino>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Expresion";
                    pilaSemantica.Push(atrp);
                    break;

                case 52:                        //T-> T*F <termino>--> <termino> * <factor>
                    atr2 = pilaSemantica.Pop(); //esto es igual a lo que tengo termino F
                    atr1 = pilaSemantica.Pop(); // esto es igual a expresion  T

                    compararTipos(atr2, atr1);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    if (atr2.principio != 0)
                    {
                        atrp.principio = atr2.principio;
                    }

                    atrp.valor = demeTemporal(atr2.tipo);
                    Gen("*", atr2.valor.ToString(), atr1.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 53:                        //T-> T/F <termino>--> <termino> / <factor>
                    atr2 = pilaSemantica.Pop(); //esto es igual a lo que tengo termino F
                    atr1 = pilaSemantica.Pop(); // esto es igual a expresion  T

                    compararTipos(atr2, atr1);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    if (atr2.principio != 0)
                    {
                        atrp.principio = atr2.principio;
                    }

                    atrp.valor = demeTemporal(atr2.tipo);
                    Gen("/", atr2.valor.ToString(), atr1.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 54:                        //T-> T^F <termino>--> <termino> ^ <factor>
                    atr2 = pilaSemantica.Pop(); //esto es igual a lo que tengo termino F
                    atr1 = pilaSemantica.Pop(); // esto es igual a expresion  T

                    compararTipos(atr2, atr1);
                    atrp.principio = Next();
                    atrp.siguiente = atrp.principio + 1;
                    if (atr2.principio != 0)
                    {
                        atrp.principio = atr2.principio;
                    }

                    atrp.valor = demeTemporal(atr2.tipo);
                    Gen("^", atr2.valor.ToString(), atr1.valor.ToString(), atrp.valor.ToString());
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 55:    // T -> F : <termino> -> <factor>
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Termino";
                    pilaSemantica.Push(atrp);
                    break;

                case 56:     // F -> i : <factor> -> identificador
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.valor       = listaReglasReconocidas[i].dato;
                    pilaSemantica.Push(atrp);
                    break;

                case 57:    // F -> (E) : < factor > -> < expresion >
                    atrp             = pilaSemantica.Pop();
                    atrp.no_terminal = listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    pilaSemantica.Push(atrp);
                    break;

                case 58:     // F -> a : <factor> -> literal
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.valor       = listaReglasReconocidas[i].dato;
                    atrp.tipo        = tipoVariable(listaReglasReconocidas[i].tipo); // obtengo el tipo de la variable
                    pilaSemantica.Push(atrp);
                    break;

                case 59:     // F -> v : <factor> -> true
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.tipo        = 5;
                    atrp.valor       = true;
                    pilaSemantica.Push(atrp);
                    break;

                case 60:     // F -> f : <factor> -> falso
                    atrp.no_terminal = this.listaReglasReconocidas[i].part_izquierda;
                    atrp.nombre      = "Factor";
                    atrp.tipo        = 5;
                    atrp.valor       = false;
                    pilaSemantica.Push(atrp);
                    break;

                default:
                    break;
                }
            }
            imprimir("op" + "\top1" + "\top2" + "\tres");
            int cont = 1;

            foreach (Cuadruplos c in list_codigo_intermedio)
            {
                imprimir(cont + "\t" + c.operador + "\t" + c.operando_1 + "\t" + c.operando_2 + "\t" + c.resultado);
                cont++;
            }
        }