Exemple #1
0
 public Simbolo(string visibilidad, string nombre, string tipo, string tipoElemento, string ambito, string rol, int apuntado, int tamanho, int noDimen, listaDimensiones dimensiones)
 {
     this.visibilidad   = visibilidad;
     this.nombreReal    = nombre;
     this.tipo          = tipo;
     this.ambito        = ambito;
     this.rol           = rol;
     this.apuntador     = apuntado;
     this.tamanho       = tamanho;
     this.tipoElemento  = tipoElemento;
     this.noDimensiones = noDimen;
     this.dimenesiones  = dimensiones;
 }
Exemple #2
0
        private List <Simbolo> generarSimbolosMetodo(ParseTreeNode nodo, List <Simbolo> lista, Ambitos ambitos)
        {
            String nombreNodo = nodo.Term.Name.ToString();

            switch (nombreNodo)
            {
                /*INSTRUCCION.Rule = DECLRACION + Eos
                 | ASIGNACION + Eos no se HACWE //
                 | SI
                 | SALIR + Eos//
                 | CONTINUAR + Eos//
                 | MIENTRAS//
                 | PARA//
                 | LOOP//
                 | HACER//
                 *
                 | REPETIR//
                 | ELEGIR;//*/

                #region nuevasJava

            case Constantes.decla2: {
                int noHijos = nodo.ChildNodes.Count;
                if (noHijos == 2)
                {    //TIPO + identificador + ToTerm(";")
                    Simbolo s = new Simbolo(Constantes.noTieneVisi, nodo.ChildNodes[1].Token.ValueString, nodo.ChildNodes[0].ChildNodes[0].Token.ValueString,
                                            getTipoAtributo(nodo.ChildNodes[0].ChildNodes[0].Token.ValueString), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1);
                    apuntador++;
                    lista.Add(s);
                    return(lista);
                }
                else if (noHijos == 3)
                {
                    if (nodo.ChildNodes[2].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase))
                    {    //TIPO + identificador + LPOSICIONES + ToTerm(";")
                        string           tipo           = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                        string           id             = nodo.ChildNodes[1].Token.ValueString;
                        ParseTreeNode    nodoPosiciones = nodo.ChildNodes[2];
                        listaDimensiones lDim;
                        Simbolo          nuevo;
                        bool             bandera = true;
                        //varifico que todo sea int
                        foreach (ParseTreeNode n in nodoPosiciones.ChildNodes)
                        {
                            bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                        }
                        if (bandera)
                        {
                            List <int> valores = new List <int>();
                            foreach (ParseTreeNode n in nodoPosiciones.ChildNodes)
                            {
                                int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString);    // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                                valores.Add(g);
                            }
                            lDim = new listaDimensiones(valores);
                            int linealizado = lDim.getLinealizado();
                            nuevo = new Simbolo(Constantes.noTieneVisi, id, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim);
                            apuntador++;
                            lista.Add(nuevo);
                        }
                        else
                        {
                            ErrorA er = new ErrorA(Constantes.errorSemantico, "Para los arreglos unicamente se permites valores enteros", nodo.FindToken());
                            Form1.errores.addError(er);
                        }



                        return(lista);
                    }
                    else
                    {    //TIPO + identificador + ToTerm("=") + EXPRESION + ";"
                        Simbolo s = new Simbolo(Constantes.noTieneVisi, nodo.ChildNodes[1].Token.ValueString, nodo.ChildNodes[0].ChildNodes[0].Token.ValueString,
                                                getTipoAtributo(nodo.ChildNodes[0].ChildNodes[0].Token.ValueString), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1);
                        apuntador++;
                        lista.Add(s);
                        return(lista);
                    }
                }
                else
                {
                    //TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";";
                    string           tipo           = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    string           id             = nodo.ChildNodes[1].Token.ValueString;
                    ParseTreeNode    nodoPosiciones = nodo.ChildNodes[2];
                    listaDimensiones lDim;
                    Simbolo          nuevo;
                    bool             bandera = true;
                    //varifico que todo sea int
                    foreach (ParseTreeNode n in nodoPosiciones.ChildNodes)
                    {
                        bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                    }
                    if (bandera)
                    {
                        List <int> valores = new List <int>();
                        foreach (ParseTreeNode n in nodoPosiciones.ChildNodes)
                        {
                            int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString);    // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                            valores.Add(g);
                        }
                        lDim = new listaDimensiones(valores);
                        int linealizado = lDim.getLinealizado();
                        nuevo = new Simbolo(Constantes.noTieneVisi, id, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim);
                        apuntador++;
                        lista.Add(nuevo);
                    }
                    else
                    {
                        ErrorA er = new ErrorA(Constantes.errorSemantico, "Para los arreglos unicamente se permites valores enteros", nodo.FindToken());
                        Form1.errores.addError(er);
                    }

                    return(lista);
                }
            }

                #endregion


            case Constantes.si:
            {
                /* *   SI.Rule = ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS + SI_NO
                 | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + L_EXTRAS
                 | ToTerm(Constantes.si) + EXPRESION + ":" + Eos + CUERPO + SI_NO;
                 */

                int noHijos = nodo.ChildNodes.Count;
                if (noHijos == 3)
                {
                    ambitos.addIf();
                    lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                    ambitos.ambitos.Pop();
                    lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos);
                }
                else
                {
                    ambitos.addIf();
                    lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                    ambitos.ambitos.Pop();
                    lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos);
                    lista = generarSimbolosMetodo(nodo.ChildNodes[3], lista, ambitos);
                }
                return(lista);
            }

            case Constantes.lextra:
            {
                //L_EXTRAS.Rule = MakeStarRule(L_EXTRAS, EXTRA);
                foreach (ParseTreeNode nodoHijo in nodo.ChildNodes)
                {
                    lista = generarSimbolosMetodo(nodoHijo, lista, ambitos);
                }
                return(lista);
            }

            case Constantes.extraSi:
            {
                //EXTRA.Rule = ToTerm(Constantes.sino_si_python) + EXPRESION + ":" + Eos + CUERPO;
                ambitos.addIf();
                lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.sino:
            {
                // SI_NO.Rule = ToTerm(Constantes.sino_python) + ":" + Eos + CUERPO;
                ambitos.addElse();
                lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }


            case Constantes.elegir:
            {
                // ELEGIR.Rule = ToTerm(Constantes.elegir) + EXPRESION + ":" + Eos + CUERPOELEGIR;
                ambitos.addElegir();
                lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.x:
            {
                ambitos.addX();
                lista = generarSimbolosMetodo(nodo.ChildNodes[2], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.cuerpoElegir:
            {
                int noHijos = nodo.ChildNodes.Count;
                if (noHijos == 2)
                {
                    lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                    lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                }
                else
                {
                    lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                }
                return(lista);
            }

            case Constantes.lcasos:
            {
                foreach (ParseTreeNode nodoHijo in nodo.ChildNodes)
                {
                    lista = generarSimbolosMetodo(nodoHijo, lista, ambitos);
                }
                return(lista);
            }

            case Constantes.defecto:
            {
                //DEFECTO.Rule = ToTerm(Constantes.defecto) + ":" + Eos + CUERPO;
                ambitos.addDefecto();
                lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.caso:
            {
                //CASO.Rule = EXPRESION + TtoTerm(":") + Eos + CUERPO;
                ambitos.addCaso();
                lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }


            case Constantes.loop:
            {
                //LOOP.Rule = ToTerm(Constantes.loop) + ":" + Eos + CUERPO;
                ambitos.addLoop();
                lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }



            case Constantes.para:
            {
                //PARA.Rule = ToTerm(Constantes.para) + "[" + ASIGNACION + ":" + EXPRESION + ":" + EXPRESION + "]" + ":" + Eos + CUERPO;
                ambitos.addPara();
                lista = generarSimbolosMetodo(nodo.ChildNodes[3], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.hacer:
            {
                //HACER.Rule = ToTerm(Constantes.hacer) + ":" + Eos + CUERPO + Constantes.mientras + EXPRESION + Eos;
                ambitos.addHAcer();
                lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }

            case Constantes.repetir:
            {
                //REPETIR.Rule = ToTerm(Constantes.repetir) + ":" + Eos + CUERPO + Constantes.hasta + EXPRESION+Eos;
                ambitos.addRepetir();
                lista = generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }



            case Constantes.asignacion:
            {
                break;
            }

            case Constantes.cuerpo:
            {
                if (nodo.ChildNodes.Count > 0)
                {
                    return(generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos));
                }
                else
                {
                    return(lista);
                }
            }

            case Constantes.instrucciones:
            {
                foreach (ParseTreeNode nodoHijo in nodo.ChildNodes)
                {
                    lista = generarSimbolosMetodo(nodoHijo, lista, ambitos);
                }
                return(lista);
            }

            case Constantes.instruccion:
            {
                return(generarSimbolosMetodo(nodo.ChildNodes[0], lista, ambitos));
            }

            case Constantes.continuar:
            {
                break;
            }

            case Constantes.salir:
            {
                break;
            }

            case Constantes.declaracion:
            {
                /*DECLAARREGLO.Rule = identificador + POSICIONES;
                 *
                 * DECLRACION.Rule = TIPO + L_IDS
                 | TIPO + DECLAARREGLO;
                 | POSICION.Rule = ToTerm("[") + EXPRESION + "]";
                 |
                 | POSICIONES.Rule = MakePlusRule(POSICIONES, POSICION);
                 |
                 */

                string tipo = nodo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                if (nodo.ChildNodes[1].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase))
                {        //es un arreglo
                    //1. validar que todas las posiciones sean un int
                    Simbolo          nuevo;
                    listaDimensiones lDim;
                    string           nombreArreglo = nodo.ChildNodes[1].ChildNodes[0].Token.Value.ToString();
                    ParseTreeNode    nodoPos       = nodo.ChildNodes[1].ChildNodes[1];
                    bool             bandera       = true;

                    foreach (ParseTreeNode n in nodoPos.ChildNodes)
                    {
                        bandera = bandera && (n.ChildNodes[0].Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                    }
                    if (bandera)
                    {
                        List <int> valores = new List <int>();
                        foreach (ParseTreeNode n in nodoPos.ChildNodes)
                        {
                            int g = int.Parse(n.ChildNodes[0].ChildNodes[0].Token.ValueString);        // (n.Term.Name.Equals(Constantes.tipoEntero, StringComparison.OrdinalIgnoreCase));
                            apuntador++;
                            valores.Add(g);
                        }
                        lDim = new listaDimensiones(valores);
                        int linealizado = lDim.getLinealizado();
                        nuevo = new Simbolo(Constantes.noTieneVisi, nombreArreglo, tipo, Constantes.ARREGLO, ambitos.ambitos.Peek(), "arreglo local", apuntador, linealizado, valores.Count, lDim);
                        lista.Add(nuevo);
                    }
                    else
                    {
                        ErrorA n = new ErrorA(Constantes.errorSemantico, "Unicamente se aceptan enteros para dimensinoes de arreglos", nodo.FindToken());
                        Form1.errores.addError(n);
                    }
                }
                else
                {        //idnomarmal
                    string  nombre;
                    Simbolo nuevo;
                    foreach (ParseTreeNode item in nodo.ChildNodes[1].ChildNodes)
                    {
                        nombre = item.Token.ValueString;
                        if (getTipoAtributo(tipo).Equals(Constantes.OBJETO, StringComparison.OrdinalIgnoreCase))
                        {
                            nuevo = new Simbolo(Constantes.noTieneVisi, nombre, tipo, getTipoAtributo(tipo), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1);
                            this.apuntador++;
                        }
                        else
                        {
                            nuevo = new Simbolo(Constantes.noTieneVisi, nombre, tipo, getTipoAtributo(tipo), ambitos.getAmbito(), Constantes.varLocal, apuntador, 1);
                            this.apuntador++;
                        }
                        lista.Add(nuevo);
                    }
                }
                return(lista);
            }

            case Constantes.mientras:
            {
                ambitos.addWhile();
                //MIENTRAS.Rule = ToTerm(Constantes.mientras) + EXPRESION+":" + Eos + CUERPO;
                lista = generarSimbolosMetodo(nodo.ChildNodes[1], lista, ambitos);
                ambitos.ambitos.Pop();
                return(lista);
            }
            }



            return(lista);
        }