Пример #1
0
        public itemValor getValor(elementoEntorno elmen)
        {
            itemValor ob = new itemValor();

            ob.setTypeNulo();

            if (hayErrores())
            {
                return(ob);
            }

            switch (hijos.Count)
            {
            case 0:
                if (lstAtributos.listaAtributos.Count > 0)
                {
                    return(parseandoDato(lstAtributos.listaAtributos[0]));
                }
                else
                {
                    tablaSimbolos.tablaErrores.insertErrorSyntax("[E] Se esperaba un valor ", new token());
                    return(ob);
                    //hay un error
                }

            case 1:

                if (hijos[0].nombre.Equals("OPE_ARITME"))
                {
                    return(hijos[0].ope_tipo(elmen));
                }
                else if (hijos[0].nombre.Equals("OPE_TIPO"))
                {
                    return(hijos[0].ope_tipo(elmen));
                }
                else if (hijos[0].nombre.Equals("SI_SIMPLIFICADO"))
                {
                    _SI_SIMPLIFICADO simplif = (_SI_SIMPLIFICADO)hijos[0];
                    return(simplif.getValor(elmen));
                }
                else if (hijos[0].nombre.Equals("LEN"))
                {
                    _LEN len = (_LEN)hijos[0];
                    return(len.getValor(elmen));
                }
                //operador unario
                else if (lstAtributos.listaAtributos.Count > 0)
                {
                    String signo = lstAtributos.getValItem(0);
                    switch (signo)
                    {
                    //Logico
                    case "-":
                        negativo opNeg = new negativo(hijos[0], tablaSimbolos, lstAtributos.getToken(0));
                        return(opNeg.opNot(" Asignando valor Negativo", elmen));

                    case "!":
                        Not opeNot = new Not(hijos[0], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeNot.opNot("Not", elmen));

                    case "(":
                        _E        ope = (_E)hijos[0];
                        itemValor te  = ope.getValor(elmen);
                        return(te);

                    default:
                        tablaSimbolos.tablaErrores.insertErrorSyntax("[E]No se reconoció el signo", lstAtributos.getToken(0));
                        return(ob);
                    }
                }
                else
                //ID_VAR_FUNC
                {
                    nodoModelo busq = getNodo("ID_VAR_FUNC");
                    if (busq != null)
                    {
                        _ID_VAR_FUNC idFunc = (_ID_VAR_FUNC)busq;
                        return(idFunc.getValor(elmen));
                    }

                    tablaSimbolos.tablaErrores.insertErrorSyntax("[E]Se esperaba un signo para operación unaria", new token());
                    return(ob);
                }

            case 2:
                //operador binario
                if (lstAtributos.listaAtributos.Count > 0)
                {
                    String signo = lstAtributos.getValItem(0);
                    switch (signo)
                    {
                    //Aritmetica
                    case "+":
                        suma ope = new suma(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(ope.opSuma(elmen));

                    case "-":
                        resta opeRes = new resta(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeRes.opResta(elmen));

                    case "*":
                        multiplicacion opeMul = new multiplicacion(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeMul.opMultiplicacion(elmen));

                    case "/":
                        division opeDiv = new division(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeDiv.opDivision(elmen));

                    case "^":
                        potencia opePot = new potencia(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opePot.opPotencia(elmen));

                    case "%":
                        modulo opeModulo = new modulo(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeModulo.opModulo(elmen));


                    //Relacional
                    case "==":
                        IgualQue opeIgualacion = new IgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeIgualacion.opIgualacion("Igualación", elmen));

                    case "!=":
                        DiferenteQue opeDiferenciacion = new DiferenteQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeDiferenciacion.opDiferenciacion("Diferenciación", elmen));

                    case ">":
                        MayorQue opeMayor = new MayorQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeMayor.opMayorQue("Mayor Que", elmen));

                    case ">=":
                        MayorIgualQue opeMayorIgual = new MayorIgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeMayorIgual.opMayorIgualQue("Mayor o Igual Que", elmen));

                    case "<":
                        MenorQue opeMenor = new MenorQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeMenor.opMenorQue("Menor Que", elmen));

                    case "<=":
                        MenorIgualQue opeMenorIgual = new MenorIgualQue(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeMenorIgual.opMenorIgualQue("Menor o Igual Que", elmen));

                    //logicas

                    case "&&":
                        And opeAnd = new And(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeAnd.opAnd("And", elmen));

                    case "||":
                        Or opeOr = new Or(hijos[0], hijos[1], tablaSimbolos, lstAtributos.getToken(0));
                        return(opeOr.opOr("Or", elmen));

                    default:
                        tablaSimbolos.tablaErrores.insertErrorSyntax("[E]No se reconoció el sigono", lstAtributos.getToken(0));
                        return(ob);
                    }
                }
                else
                {
                    tablaSimbolos.tablaErrores.insertErrorSyntax("[E]Se esperaba un signo para operación binaria", new token());
                    return(ob);
                }

            default:
                return(ob);
            }
        }
Пример #2
0
        /*
         |-------------------------------------------------------------------------------------------------------------------
         | EJECUCIÓN FINAL
         |-------------------------------------------------------------------------------------------------------------------
         |
         */

        public override itemRetorno ejecutar(elementoEntorno tablaEntornos)

        /*
         |----------------------------
         | EJECUTAR
         |----------------------------
         | 0= normal
         | 1 = return;
         | 2 = break
         | 3 = continue
         | 4 = errores
         */
        {
            itemRetorno retorno = new itemRetorno(0);

            if (hayErrores())
            {
                return(retorno);
            }



            if (hijos.Count == 2)

            /*
             |----------------------------
             |  ID_VAR_FUNC + VAL
             */

            {
                //PUNTERO DONDE VOY A GUARDAR EL VALOR
                _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC");
                itemEntorno  destino  = nodoFunc.getDestino(tablaEntornos);


                //AHORA OBTENGO EL VALOR
                _VAL nodoVal = (_VAL)getNodo("VAL");
                if (nodoVal != null)
                {
                    if (destino != null)
                    {
                        itemValor valor = nodoVal.getValor(tablaEntornos, destino.tipo);
                        if (destino.lstDimensionesAcceso.Count > 0)
                        //viene la posición de un arreglo
                        {
                            asignarValorMatriz(destino, valor);
                        }
                        else
                        {
                            asignarValor(destino, valor);
                        }
                    }
                    else
                    {
                        println("Me retorno un itemEntorno vacio, no podré asignar la variable prro");
                    }
                }
                else
                {
                    println("no tiene nodo VAl");
                }
            }

            else if (hijos.Count == 1)
            {
                if (lstAtributos.getToken(0).valLower.Equals("+"))

                /*
                 |----------------------------
                 |  ID_VAR_FUNC + sMas + sMas
                 */
                {
                    if (hayErrores())
                    {
                        return(retorno);
                    }

                    _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC");
                    itemEntorno  destino  = nodoFunc.getDestino(tablaEntornos);



                    if (destino.lstDimensionesAcceso.Count > 0)
                    //viene la posición de un arreglo
                    {
                        tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede incrementar la matriz " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre);
                    }
                    else
                    {
                        itemValor valor  = nodoFunc.getValor(tablaEntornos);
                        itemValor valor2 = new itemValor();
                        valor2.setValue(1);

                        suma sumatoria = new suma(new _E("hijo1", tablaSimbolos), new _E("hijo2", tablaSimbolos), tablaSimbolos, lstAtributos.getToken(0));

                        itemValor resultado = sumatoria.opSumaExterna(tablaEntornos, valor, valor2);

                        Object ObjParseado = resultado.getValorParseado(destino.tipo.valLower);
                        if (ObjParseado != null)
                        {
                            destino.valor.valor = ObjParseado;
                            return(retorno);
                        }
                        else
                        {
                            tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede asignar un tipo :" + sumatoria.GetType() + " a la variable " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre);
                            return(retorno);
                        }
                    }
                }
                else

                /*
                 |----------------------------
                 |  ID_VAR_FUNC + smenos + smenos
                 */
                {
                    if (hayErrores())
                    {
                        return(retorno);
                    }

                    _ID_VAR_FUNC nodoFunc = (_ID_VAR_FUNC)getNodo("ID_VAR_FUNC");
                    itemEntorno  destino  = nodoFunc.getDestino(tablaEntornos);



                    if (destino.lstDimensionesAcceso.Count > 0)
                    //viene la posición de un arreglo
                    {
                        tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede incrementar la matriz " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre);
                    }
                    else
                    {
                        itemValor valor  = nodoFunc.getValor(tablaEntornos);
                        itemValor valor2 = new itemValor();
                        valor2.setValue(1);

                        resta sumatoria = new resta(new _E("hijo1", tablaSimbolos), new _E("hijo2", tablaSimbolos), tablaSimbolos, lstAtributos.getToken(0));

                        itemValor resultado = sumatoria.opRestaExterna(tablaEntornos, valor, valor2);

                        Object ObjParseado = resultado.getValorParseado(destino.tipo.valLower);
                        if (ObjParseado != null)
                        {
                            destino.valor.valor = ObjParseado;
                            return(retorno);
                        }
                        else
                        {
                            tablaSimbolos.tablaErrores.insertErrorSemantic("No se puede asignar un tipo :" + sumatoria.GetType() + " a la variable " + destino.nombre.val + " de tipo: " + destino.tipo.valLower, destino.nombre);
                            return(retorno);
                        }
                    }
                }
            }

            return(retorno);
        }
Пример #3
0
        public nodoModelo getNodo(String nombreNoTerminal, tablaSimbolos tabla)
        {
            nodoModelo retorno = null;

            switch (nombreNoTerminal)
            {
            case "S":
                retorno = new _S(nombreNoTerminal, tabla);

                break;

            case "LST_IMPORT":
                retorno = new _LST_IMPORT(nombreNoTerminal, tabla);

                break;

            case "IMPORT":
                retorno = new _IMPORT(nombreNoTerminal, tabla);

                break;

            case "LST_CLASE":
                retorno = new _LST_CLASE(nombreNoTerminal, tabla);

                break;

            case "CLASE":
                retorno = new _CLASE(nombreNoTerminal, tabla);

                break;

            case "TIPO":
                retorno = new _TIPO(nombreNoTerminal, tabla);

                break;

            case "EXTENDER":
                retorno = new _EXTENDER(nombreNoTerminal, tabla);

                break;

            case "VISIBILIDAD":
                retorno = new _VISIBILIDAD(nombreNoTerminal, tabla);

                break;

            case "LST_PARAMETROS":
                retorno = new _LST_PARAMETROS(nombreNoTerminal, tabla);

                break;

            case "PARAMETRO":
                retorno = new _PARAMETRO(nombreNoTerminal, tabla);

                break;

            case "LST_VAL":
                retorno = new _LST_VAL(nombreNoTerminal, tabla);

                break;

            case "CP_CLASE":
                retorno = new _CP_CLASE(nombreNoTerminal, tabla);

                break;

            case "CUERPO_CLASE":
                retorno = new _CUERPO_CLASE(nombreNoTerminal, tabla);

                break;

            case "METODO":
                retorno = new _METODO(nombreNoTerminal, tabla);

                break;

            case "SOBRESCRITURA":
                retorno = new _SOBRESCRITURA(nombreNoTerminal, tabla);

                break;

            case "MAIN":
                retorno = new _MAIN(nombreNoTerminal, tabla);

                break;

            case "CONSTRUCTOR":
                retorno = new _CONSTRUCTOR(nombreNoTerminal, tabla);

                break;

            case "DECLARAR_VARIABLE_GLOBAL":
                retorno = new _DECLARAR_VARIABLE_GLOBAL(nombreNoTerminal, tabla);

                break;

            case "DECLARAR_VARIABLE_SINVISIBI":
                retorno = new _DECLARAR_VARIABLE_SINVISIBI(nombreNoTerminal, tabla);

                break;

            case "VAL":
                retorno = new _VAL(nombreNoTerminal, tabla);

                break;

            case "LST_LLAVES_VAL":
                retorno = new _LST_LLAVES_VAL(nombreNoTerminal, tabla);

                break;

            case "LLAVES_VAL_P":
                retorno = new _LLAVES_VAL_P(nombreNoTerminal, tabla);

                break;

            case "VAR_ARREGLO":
                retorno = new _VAR_ARREGLO(nombreNoTerminal, tabla);

                break;

            case "LST_CORCHETES":
                retorno = new _LST_CORCHETES(nombreNoTerminal, tabla);

                break;

            case "LST_CORCHETES_VAL":
                retorno = new _LST_CORCHETES_VAL(nombreNoTerminal, tabla);

                break;

            case "USAR_METO_VAR":
                retorno = new _USAR_METO_VAR(nombreNoTerminal, tabla);

                break;

            case "USAR_VARIABLEP":
                retorno = new _USAR_VARIABLEP(nombreNoTerminal, tabla);

                break;

            case "USAR_VARIABLE":
                retorno = new _USAR_VARIABLE(nombreNoTerminal, tabla);

                break;

            case "USAR_METODO":
                retorno = new _USAR_METODO(nombreNoTerminal, tabla);

                break;

            case "LLAMADA_FORMULARIO":
                retorno = new _LLAMADA_FORMULARIO(nombreNoTerminal, tabla);

                break;

            case "LST_CUERPO":
                retorno = new _LST_CUERPO(nombreNoTerminal, tabla);

                break;

            case "CUERPO":
                retorno = new _CUERPO(nombreNoTerminal, tabla);

                break;

            case "VALOR":
                retorno = new _VALOR(nombreNoTerminal, tabla);

                break;

            case "PAR_CORCHETES_VACIOS":
                retorno = new _PAR_CORCHETES_VACIOS(nombreNoTerminal, tabla);
                break;

            case "E":
                retorno = new _E(nombreNoTerminal, tabla);
                break;

            case "FUNCIONES_NATIVAS":
                retorno = new _FUNCIONES_NATIVAS(nombreNoTerminal, tabla);
                break;

            case "IMPRIMIR":
                retorno = new _IMPRIMIR(nombreNoTerminal, tabla);
                break;


            case "ID_VAR_FUNC":
                retorno = new _ID_VAR_FUNC(nombreNoTerminal, tabla);
                break;

            case "LST_PUNTOSP":
                retorno = new _LST_PUNTOSP(nombreNoTerminal, tabla);
                break;

            case "ASIG_VALOR":
                retorno = new _ASIG_VALOR(nombreNoTerminal, tabla);
                break;

            case "PAR_CORCHETES_VAL":
                retorno = new _PAR_CORCHETES_VAL(nombreNoTerminal, tabla);
                break;

            case "RETORNO":
                retorno = new _RETORNO(nombreNoTerminal, tabla);
                break;

            case "SI":
                retorno = new _SI(nombreNoTerminal, tabla);
                break;


            case "SINO_SI":
                retorno = new _SINO_SI(nombreNoTerminal, tabla);
                break;


            case "SINO":
                retorno = new _SINO(nombreNoTerminal, tabla);
                break;

            case "SENTENCIAS":
                retorno = new _SENTENCIAS(nombreNoTerminal, tabla);
                break;

            case "SI_SIMPLIFICADO":
                retorno = new _SI_SIMPLIFICADO(nombreNoTerminal, tabla);
                break;

            case "CASO":
                retorno = new _CASO(nombreNoTerminal, tabla);
                break;

            case "CUERPO_CASE":
                retorno = new _CUERPO_CASE(nombreNoTerminal, tabla);
                break;

            case "ROMPER":
                retorno = new _ROMPER(nombreNoTerminal, tabla);
                break;

            case "WHILE":
                retorno = new _WHILE(nombreNoTerminal, tabla);
                break;


            case "CONTINUAR":
                retorno = new _CONTINUAR(nombreNoTerminal, tabla);
                break;

            case "FOR":
                retorno = new _FOR(nombreNoTerminal, tabla);
                break;

            case "DOWHILE":
                retorno = new _DOWHILE(nombreNoTerminal, tabla);
                break;

            case "REPETIR":
                retorno = new _REPETIR(nombreNoTerminal, tabla);
                break;

            case "MENSAJE":
                retorno = new _MENSAJE(nombreNoTerminal, tabla);
                break;

            case "TO_CADENA":
                retorno = new _TO_CADENA(nombreNoTerminal, tabla);
                break;

            case "SUB_CAD":
                retorno = new _SUB_CAD(nombreNoTerminal, tabla);
                break;

            case "POS_CAD":
                retorno = new _POS_CAD(nombreNoTerminal, tabla);
                break;

            case "TO_BOOLEAN":
                retorno = new _TO_BOOLEAN(nombreNoTerminal, tabla);
                break;

            case "TO_ENTERO":
                retorno = new _TO_ENTERO(nombreNoTerminal, tabla);
                break;

            case "HOY":
                retorno = new _HOY(nombreNoTerminal, tabla);
                break;

            case "AHORA":
                retorno = new _AHORA(nombreNoTerminal, tabla);
                break;

            case "TO_FECHA":
                retorno = new _TO_FECHA(nombreNoTerminal, tabla);
                break;

            case "TO_HORA":
                retorno = new _TO_HORA(nombreNoTerminal, tabla);
                break;

            case "TO_FECHAHORA":
                retorno = new _TO_FECHAHORA(nombreNoTerminal, tabla);
                break;

            case "TAM":
                retorno = new _TAM(nombreNoTerminal, tabla);
                break;

            case "RANDOM":
                retorno = new _RANDOM(nombreNoTerminal, tabla);
                break;

            case "MIN":
                retorno = new _MIN(nombreNoTerminal, tabla);
                break;

            case "MAX":
                retorno = new _MAX(nombreNoTerminal, tabla);
                break;

            case "OPE_TIPO":
                retorno = new _OPE_TIPO(nombreNoTerminal, tabla);
                break;

            case "OPE_ARITME":
                retorno = new _OPE_ARITME(nombreNoTerminal, tabla);
                break;


            case "POTENCIA":
                retorno = new _POTENCIA(nombreNoTerminal, tabla);
                break;

            case "LOGARITMO":
                retorno = new _LOGARITMO(nombreNoTerminal, tabla);
                break;

            case "LOGARITMO10":
                retorno = new _LOGARITMO10(nombreNoTerminal, tabla);
                break;

            case "ABSOLUTO":
                retorno = new _ABSOLUTO(nombreNoTerminal, tabla);
                break;

            case "SENO":
                retorno = new _SENO(nombreNoTerminal, tabla);
                break;

            case "COSENO":
                retorno = new _COSENO(nombreNoTerminal, tabla);
                break;

            case "TANGENTE":
                retorno = new _TANGENTE(nombreNoTerminal, tabla);
                break;

            case "RAIZ":
                retorno = new _RAIZ(nombreNoTerminal, tabla);
                break;

            case "PI":
                retorno = new _PI(nombreNoTerminal, tabla);
                break;


            case "SUPER":
                retorno = new _SUPER(nombreNoTerminal, tabla);
                return(retorno);

            case "FORMULARIO":
                retorno = new _FORMULARIO(nombreNoTerminal, tabla);
                return(retorno);


            case "PREGUNTA":
                retorno = new _PREGUNTA(nombreNoTerminal, tabla);
                return(retorno);


            case "GRUPO":
                retorno = new _GRUPO(nombreNoTerminal, tabla);
                return(retorno);


            case "LST_CUERPO_PREGUNTA":
                retorno = new _LST_CUERPO_PREGUNTA(nombreNoTerminal, tabla);
                return(retorno);


            case "CUERPO_PREGUNTA":
                retorno = new _CUERPO_PREGUNTA(nombreNoTerminal, tabla);
                return(retorno);

            case "PREGUNTA_NATIVA":
                retorno = new _PREGUNTA_NATIVA(nombreNoTerminal, tabla);
                return(retorno);

            case "ESCRIBIR_ARCHIVO":
                retorno = new _ESCRIBIR_ARCHIVO(nombreNoTerminal, tabla);
                return(retorno);

            case "FUNC_MULTIMEDIA":
                retorno = new _FUNC_MULTIMEDIA(nombreNoTerminal, tabla);
                return(retorno);

            case "AUDIO":
                retorno = new _AUDIO(nombreNoTerminal, tabla);
                return(retorno);

            case "VIDEO":
                retorno = new _VIDEO(nombreNoTerminal, tabla);
                return(retorno);

            case "IMAGEN":
                retorno = new _IMAGEN(nombreNoTerminal, tabla);
                return(retorno);

            case "LEN":
                retorno = new _LEN(nombreNoTerminal, tabla);
                return(retorno);

            default:
                retorno = new nodoModelo("Desc_" + nombreNoTerminal, tabla);
                Console.WriteLine("[generarArbol]No se encontró el nodo:" + nombreNoTerminal);
                break;
            }

            return(retorno);
        }