示例#1
0
        public clasesDiagrama generarUML2(ParseTreeNode raiz)
        {
            clasesDiagrama nuevo = new clasesDiagrama();

            generarListadoClases(raiz);
            Clase claseActual;

            foreach (ParseTreeNode actual in this.clasesUML)
            {
                claseActual = generarClase(actual);
                if (claseActual != null)
                {
                    claseActual.setLenguaje("java");
                    if (!nuevo.insertarClase(claseActual))
                    {
                        ErrorA nuev3o = new ErrorA(Constantes.errorSemantico, "La clase " + claseActual.getNombre() + ", no se pudo crear, ya existe", actual.FindToken());
                        Form1.errores.addError(nuev3o);
                    }
                }
                else
                {
                    ErrorA nuev3o = new ErrorA(Constantes.errorSemantico, "Ocurrio un error, no se pudo generar la clase ", actual.FindToken());
                    Form1.errores.addError(nuev3o);
                }
            }
            return(nuevo);
        }
示例#2
0
        private Funcion getconstructor(ParseTreeNode nodoConstructor, string nombreClase)
        {
            //CONSTRUCTOR.Rule = ToTerm("__constructor") + "[" + PARAMETROS + "]" + ":" + Eos + CUERPO;
            Cuerpo         instr;
            ListaParametro parametros = getParametros(nodoConstructor.ChildNodes[0]);
            string         nombre     = nodoConstructor.ChildNodes[0].Token.Value.ToString();
            Funcion        nueva      = new Funcion(nombreClase, Constantes.constructor, Constantes.tipoVoid, parametros, Constantes.publico, nodoConstructor.ChildNodes[1]);

            if (nombre.Equals(nombreClase, StringComparison.OrdinalIgnoreCase))
            {
                nueva = new Funcion(nombreClase, nombre, Constantes.tipoVoid, parametros, Constantes.publico, nodoConstructor.ChildNodes[1]);
                nueva.setConstructor(true);
                // instr = getCuerpo(nodoConstructor.ChildNodes[1]);
                // nueva.setCuerpo(instr);
                return(nueva);
            }
            else
            {
                ErrorA nuevo = new ErrorA(Constantes.errorSemantico, nodoConstructor.ChildNodes[0].Token.Location.Line,
                                          nodoConstructor.ChildNodes[0].Token.Location.Position, nodoConstructor.ChildNodes[0].Token.Location.Column,
                                          "El nombre de " + nombre + ", no coincide con el nombre de clase, " + nombreClase);
                Form1.errores.addError(nuevo);
                return(null);
                //error semantico
            }
        }
示例#3
0
        private Instruccion getInstruccion(ParseTreeNode instr)
        {
            switch (instr.Term.Name)
            {
            case Constantes.expresion:     //para las llamadas
            {
                int noHijos = instr.ChildNodes.Count;
                ExpresionLlamada nuevaLlamada;
                if (instr.ChildNodes[noHijos - 1].Term.Name.Equals(Constantes.llamada, StringComparison.OrdinalIgnoreCase))
                {
                    nuevaLlamada = new ExpresionLlamada(instr);
                    return(nuevaLlamada);
                }
                else
                {
                    ErrorA err = new ErrorA(Constantes.errorSemantico, "En invalido colocar este tipo de expresion, debe ser una llamada", instr.Token);
                    Form1.errores.addError(err);
                    return(null);
                }
            }

            case Constantes.declaracion: {
                Declaracion nuevo = new Declaracion(instr);
                return(nuevo);
            }
            }


            return(null);
        }
示例#4
0
        private Clase agregarInstruccionesClase(Clase claseModificar, ParseTreeNode instrucciones)
        {
            foreach (ParseTreeNode item in instrucciones.ChildNodes)
            {
                switch (item.Term.Name)
                {/*ELEMENTO.Rule = FUNCION
                  | ATRIBUTO
                  | CONSTRUCTOR
                  | FUNCION_SOBRE;
                  */
                case Constantes.funcion:
                {
                    Funcion nueva = getFuncion(item, claseModificar.getNombre());
                    claseModificar.addFuncion(nueva);

                    break;
                }

                case Constantes.atributo:
                {
                    List <Atributo> atributos = generarAtributos(item);
                    foreach (Atributo atr in atributos)
                    {
                        claseModificar.addAtributo(atr);
                    }

                    break;
                }

                case Constantes.constructor:
                {
                    Funcion constructor = getconstructor(item, claseModificar.getNombre());
                    if (constructor != null)
                    {
                        claseModificar.addFuncion(constructor);
                    }
                    else
                    {
                        ErrorA nuevo = new ErrorA("Semantico", "No se pudo generar el constructor", item.Token);
                        Form1.errores.addError(nuevo);
                    }

                    break;
                }

                case Constantes.funSobre:
                {
                    Funcion nueva = getFuncion(item.ChildNodes[0], claseModificar.getNombre());
                    nueva.setSobreescrita(true);
                    claseModificar.addFuncion(nueva);
                    break;
                }
                }
            }

            return(claseModificar);
        }
示例#5
0
        private void heap(ParseTreeNode nodo, int modo)
        {
            if (modo == 0)
            {
                //asignacionHeap.Rule = identificador + ToTerm("=") + "HEAP" + "[" + EXPRESION + "]" + ";";
                string id  = nodo.ChildNodes[0].Token.ValueString;
                Object val = resolverExp(nodo.ChildNodes[1]);
                if (!esNula(val))
                {
                    int indice = (int)val;
                    temporales.agregarTemp(new Temporal(id, Heap[indice]));
                }
                else
                {
                    ErrorA er = new ErrorA("Semantico", "Ocurrio un error a realizar la operacion", nodo.FindToken());
                    Form1.errores.addError(er);
                }
            }
            else if (modo == 1)
            {//heap.Rule = ToTerm("HEAP") + "[" + EXPRESION + "]" + "=" + EXPRESION + ";";
                object objIndice = resolverExp(nodo.ChildNodes[0]);
                object valor     = resolverExp(nodo.ChildNodes[1]);
                if (!esNula(objIndice) && !esNula(valor))
                {
                    int indice = (int)objIndice;


                    if (valor is Double)
                    {
                        Heap[indice] = (double)valor;
                    }
                    else if (valor is int)
                    {
                        Heap[indice] = (int)valor;
                    }
                }
                else
                {
                    ErrorA er = new ErrorA("Semantico", "Ocurrio un error a realizar la operacion", nodo.FindToken());
                    Form1.errores.addError(er);
                }
            }
        }
示例#6
0
 private void pila(ParseTreeNode nodo, int modo)
 {
     if (modo == 0)
     {// identificador + ToTerm("=") + "STACK" + "[" + EXPRESION + "]" + ";";
         string id  = nodo.ChildNodes[0].Token.ValueString;
         Object val = resolverExp(nodo.ChildNodes[1]);
         int    aux = (int)val;
         if (!val.ToString().Equals("nulo"))
         {
             temporales.agregarTemp(new Temporal(id, Pila[aux]));
         }
         else
         {
             ErrorA er = new ErrorA("Semantico", "Ocurrio un error a realizar la operacion", nodo.FindToken());
             Form1.errores.addError(er);
         }
     }
     else if (modo == 1)
     {// stack.Rule = ToTerm("STACK") + "[" + EXPRESION + "]" + "=" + EXPRESION + ";";
         Object indice = resolverExp(nodo.ChildNodes[0]);
         Object valor  = resolverExp(nodo.ChildNodes[1]);
         if (!valor.ToString().Equals("nulo") &&
             !indice.ToString().Equals("nulo"))
         {
             int ind = (int)indice;
             if (valor is Double)
             {
                 Pila[ind] = (double)valor;
             }
             else if (valor is int)
             {
                 Pila[ind] = (int)valor;
             }
         }
         else
         {
             ErrorA er = new ErrorA("Semantico", "Ocurrio un error a realizar la operacion", nodo.FindToken());
             Form1.errores.addError(er);
         }
     }
 }
示例#7
0
/*
 *      private List<Atributo> generarAtributos(ParseTreeNode nodoAtributo)
 *      {
 *
 *            ATRIBUTO.Rule = VISIBILIDAD + TIPO + L_IDS + ToTerm(";")3,4,2,3
 | VISIBILIDAD + TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";")
 | TIPO + L_IDS + ToTerm(";")
 | TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";");
 |
 |
 |          List<Atributo> lista = new List<Atributo>();
 |          Atributo nuevo;
 |          int noHijos = nodoAtributo.ChildNodes.Count;
 |          string tipo, nombre, visibilidad;
 |          if (noHijos == 2)
 |          {
 |              visibilidad = Constantes.publico;
 |              tipo = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.Value.ToString();
 |              foreach (ParseTreeNode item in nodoAtributo.ChildNodes[1].ChildNodes)
 |              {
 |                  nombre = item.Token.Value.ToString();
 |                  nuevo = new Atributo(visibilidad, nombre, tipo);
 |                  lista.Add(nuevo);
 |              }
 |              return lista;
 |
 |          }
 |          else if (noHijos == 4)
 |          {
 |              visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.Value.ToString();
 |              tipo = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.Value.ToString();
 |              nombre = nodoAtributo.ChildNodes[2].Token.Value.ToString();
 |              nuevo = new Atributo(visibilidad, nombre, tipo);
 |              lista.Add(nuevo);
 |              return lista;
 |          }
 |          else
 |          {//posee tres hijos
 |              if (nodoAtributo.ChildNodes[0].Term.Name.Equals(Constantes.visibilidad))
 |              {
 |
 |                  visibilidad =nodoAtributo.ChildNodes[0].ChildNodes[0].Token.Value.ToString();
 |                  tipo = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.Value.ToString();
 |                  foreach (ParseTreeNode item in nodoAtributo.ChildNodes[2].ChildNodes)
 |                  {
 |                      nombre = item.Token.Value.ToString();
 |                      nuevo = new Atributo(visibilidad, nombre, tipo);
 |                      lista.Add(nuevo);
 |                  }
 |                  return lista;
 |
 |              }
 |              else
 |              {
 |                  visibilidad = Constantes.publico;
 |                  tipo = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.Value.ToString();
 |                  nombre = nodoAtributo.ChildNodes[1].Token.Value.ToString();
 |                  nuevo = new Atributo(visibilidad, nombre, tipo);
 |                  lista.Add(nuevo);
 |                  return lista;
 |
 |
 |              }
 |
 |          }
 |
 |      }
 */

        private Funcion getConstructor(ParseTreeNode nodoConstructor, string nombreClase)
        {
            /* CONSTRUCTOR.Rule = identificador + ToTerm("(") + L_PARAMETRO + ToTerm(")") + CUERPO;*/
            Funcion constructor;
            string  nombre = nodoConstructor.ChildNodes[0].Token.Value.ToString();

            if (nombre.ToUpper().Equals(nombreClase.ToUpper()))
            {
                ListaParametro parametros = getParametros(nodoConstructor.ChildNodes[1]);
                constructor = new Funcion(nombreClase, nombre, Constantes.tipoVoid, parametros, Constantes.publico, nodoConstructor.ChildNodes[2]);
                constructor.setConstructor(true);
                return(constructor);
            }
            else
            {
                ErrorA nuevo = new ErrorA(Constantes.errorSemantico, nodoConstructor.ChildNodes[0].Token.Location.Line,
                                          nodoConstructor.ChildNodes[0].Token.Location.Position, nodoConstructor.ChildNodes[0].Token.Location.Column,
                                          "El nombre de " + nombre + ", no coincide con el nombre de clase, " + nombreClase);
                Form1.errores.addError(nuevo);
                return(null);
                //error semantico
            }
        }
示例#8
0
        public void generarUML(ParseTreeNode raiz)
        {
            generarListadoClases(raiz);
            Clase claseActual;

            foreach (ParseTreeNode actual in this.clasesUML)
            {
                claseActual = generarClase(actual);
                if (claseActual != null)
                {
                    claseActual.setLenguaje("python");
                    if (!Form1.uml.insertarClase(claseActual))
                    {
                        ErrorA nuevo = new ErrorA(Constantes.errorSemantico, "La clase " + claseActual.getNombre() + ", no se pudo crear, ya existe", actual.FindToken());
                        Form1.errores.addError(nuevo);
                    }
                }
                else
                {
                    ErrorA nuevo = new ErrorA(Constantes.errorSemantico, "Ocurrio un error, no se pudo generar la clase ", actual.FindToken());
                    Form1.errores.addError(nuevo);
                }
            }
        }
示例#9
0
        private Object resolverExp(ParseTreeNode nodo)
        {
            switch (nodo.Term.Name)
            {
            case "TERMINO":
            {
                return(resolverExp(nodo.ChildNodes[0]));
            }

            case ConstantesInterprete.ENTERO:
            {
                return(int.Parse(nodo.ChildNodes[0].Token.ValueString));
            }

            case ConstantesInterprete.DECIMAL:
            {
                return(double.Parse(nodo.ChildNodes[0].Token.ValueString));
            }

            case "ID":
            {
                string id = nodo.ChildNodes[0].Token.ValueString;
                return(temporales.getValorTemp(id));
            }

            case ConstantesInterprete.NEGATIVO:
            {
                Object valn = resolverExp(nodo.ChildNodes[1]);
                if (valn is int)
                {
                    return(int.Parse(valn + "") * -1);
                }
                if (valn is Double)
                {
                    return(Double.Parse(valn + "") * -1);
                }
                return("");
            }

            case ConstantesInterprete.OPERACION:
            {
                #region operaciones
                Object val1 = resolverExp(nodo.ChildNodes[0]);
                Object val2 = resolverExp(nodo.ChildNodes[2]);

                switch (nodo.ChildNodes[1].ChildNodes[0].Term.Name)
                {
                case "+":
                {
                    if ((esInt(val1) || esDouble(val1)) &&
                        (esInt(val2) || esDouble(val2)))
                    {
                        if (esInt(val2) && esInt(val2))
                        {
                            return((int)int.Parse(val1.ToString()) + int.Parse(val2.ToString()));
                        }
                        else
                        {
                            return((Double)double.Parse(val1.ToString()) + double.Parse(val2.ToString()));
                        }
                    }
                    else
                    {
                        ErrorA n = new ErrorA("Semantico", "Tipos no validos para una suma", nodo.FindToken());
                        Form1.errores.addError(n);
                        return("nulo");
                    }
                }

                case "-":
                {
                    if ((esInt(val1) || esDouble(val1)) &&
                        (esInt(val2) || esDouble(val2)))
                    {
                        if (esInt(val2) && esInt(val2))
                        {
                            return((int)int.Parse(val1.ToString()) - int.Parse(val2.ToString()));
                        }
                        else
                        {
                            return((Double)double.Parse(val1.ToString()) - double.Parse(val2.ToString()));
                        }
                    }
                    else
                    {
                        ErrorA n = new ErrorA("Semantico", "Tipos no validos para una resta", nodo.FindToken());
                        Form1.errores.addError(n);
                        return("nulo");
                    }
                }

                case "*":
                {
                    if ((esInt(val1) || esDouble(val1)) &&
                        (esInt(val2) || esDouble(val2)))
                    {
                        if (esInt(val2) && esInt(val2))
                        {
                            return((int)int.Parse(val1.ToString()) * int.Parse(val2.ToString()));
                        }
                        else
                        {
                            return((Double)double.Parse(val1.ToString()) * double.Parse(val2.ToString()));
                        }
                    }
                    else
                    {
                        ErrorA n = new ErrorA("Semantico", "Tipos no validos para una multiplicacion", nodo.FindToken());
                        Form1.errores.addError(n);
                        return("nulo");
                    }
                }

                case "/":
                {
                    if ((esInt(val1) || esDouble(val1)) &&
                        (esInt(val2) || esDouble(val2)))
                    {
                        if (int.Parse(val2.ToString()) != 0)
                        {
                            return(double.Parse(val1.ToString()) / double.Parse(val2.ToString()));
                        }
                        else
                        {
                            ErrorA n = new ErrorA("Semantico", "No se puede realizar division por cero", nodo.FindToken());
                            Form1.errores.addError(n);
                            return("nulo");
                        }
                    }
                    else
                    {
                        ErrorA n = new ErrorA("Semantico", "Tipos no validos para una division", nodo.FindToken());
                        Form1.errores.addError(n);
                        return("nulo");
                    }
                }

                case "^":
                {
                    if ((esInt(val1) || esDouble(val1)) &&
                        (esInt(val2) || esDouble(val2)))
                    {
                        if (esInt(val2) && esInt(val2))
                        {
                            return((int)Math.Pow(int.Parse(val1.ToString()), int.Parse(val2.ToString())));
                        }
                        else
                        {
                            return((Double)Math.Pow(Double.Parse(val1.ToString()), Double.Parse(val2.ToString())));
                        }
                    }
                    else
                    {
                        ErrorA n = new ErrorA("Semantico", "Tipos no validos para una potencia", nodo.FindToken());
                        Form1.errores.addError(n);
                        return("nulo");
                    }
                }
                }        //fin switch operaciones
                #endregion
            }

                return("nulo");
            }
            return("nulo");
        }
示例#10
0
        private Clase agregarInstruccionesClase(Clase claseModificar, ParseTreeNode instrucciones)
        {
            foreach (ParseTreeNode item in instrucciones.ChildNodes)
            {
                switch (item.Term.Name)
                {
                case Constantes.funcion:
                {
                    Funcion nueva = getFuncion(item, claseModificar.getNombre());
                    claseModificar.addFuncion(nueva);
                    break;
                }

                case Constantes.funSobre:
                {
                    Funcion nueva = getFuncion(item.ChildNodes[0], claseModificar.getNombre());
                    nueva.setSobreescrita(true);
                    claseModificar.addFuncion(nueva);
                    break;
                }

                case Constantes.atributo:
                {
                    List <Atributo> atributos = generarAtributos(item);
                    foreach (Atributo atr in atributos)
                    {
                        claseModificar.addAtributo(atr);
                    }
                    break;
                }

                case Constantes.principal:
                {
                    if (!claseModificar.funciones.hayPrincipal())
                    {
                        Funcion principal = getPrincipal(item, claseModificar.getNombre());
                        claseModificar.addFuncion(principal);
                    }
                    else
                    {
                        ErrorA err = new ErrorA(Constantes.errorSemantico, item.FindToken().Location.Line, item.FindToken().Location.Position, item.FindToken().Location.Column, "Una clase unicamente puede poseer un metodo principal");
                        Form1.errores.addError(err);
                    }
                    break;
                }

                case Constantes.constructor:
                {
                    Funcion constructor = getConstructor(item, claseModificar.getNombre());
                    if (constructor != null)
                    {
                        claseModificar.addFuncion(constructor);
                    }
                    else
                    {
                        ErrorA nuevo = new ErrorA("Semantico", "No se pudo generar el constructor", item.Token);
                        Form1.errores.addError(nuevo);
                    }

                    break;
                }
                }
            }


            return(claseModificar);
        }
示例#11
0
        private List <Atributo> generarAtributos(ParseTreeNode nodoAtributo)
        {
            List <Atributo> lista = new List <Atributo>();
            Atributo        nuevo;
            int             noHijos = nodoAtributo.ChildNodes.Count;
            string          tipo, nombre, visibilidad;


            if (noHijos == 3 && nodoAtributo.ChildNodes[2].Term.Name.Equals(Constantes.instancia, StringComparison.OrdinalIgnoreCase))
            {
                ////TIPO + identificador + ToTerm("=") + INSTANCIA + ";"
                visibilidad = Constantes.publico;
                tipo        = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                nombre      = nodoAtributo.ChildNodes[1].Token.ValueString;

                nuevo = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[2]);
                lista.Add(nuevo);
            }

            else if (noHijos == 4 && nodoAtributo.ChildNodes[3].Term.Name.Equals(Constantes.instancia, StringComparison.OrdinalIgnoreCase))
            {//VISIBILIDAD + TIPO + identificador + ToTerm("=") + INSTANCIA
                visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                tipo        = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.ValueString;
                nombre      = nodoAtributo.ChildNodes[2].Token.ValueString;
                nuevo       = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[3]);
                lista.Add(nuevo);
            }
            else if (noHijos == 5)
            {//arreglo con filas declaradas y visibilidad
                // VISIBILIDAD + TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";"
                visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                tipo        = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.ValueString;
                nombre      = nodoAtributo.ChildNodes[2].Token.ValueString;
                int             noPosiciones           = nodoAtributo.ChildNodes[3].ChildNodes.Count;
                ParseTreeNode[] expresionesDimensiones = getExpresionesArreglo(nodoAtributo.ChildNodes[3]);
                if (noPosiciones == expresionesDimensiones.Length && noPosiciones == nodoAtributo.ChildNodes[4].ChildNodes.Count)
                {//si se puede crear el arreglo
                    nuevo = new Atributo(visibilidad, nombre, tipo, Constantes.ARREGLO, noPosiciones, expresionesDimensiones);
                    nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[4]);
                    lista.Add(nuevo);
                }
                else
                {//error semantico
                    ErrorA err = new ErrorA(Constantes.errorSemantico, "No coinciden numero de dimensiones", nodoAtributo.Token);
                    Form1.errores.addError(err);
                }
            }
            else if (noHijos == 4)
            {
                if (nodoAtributo.ChildNodes[0].Term.Name.Equals(Constantes.tipo, StringComparison.OrdinalIgnoreCase))
                {
                    // TIPO + identificador + LPOSICIONES + ToTerm("=") + "{" + LFILAS + "}" + ";";

                    visibilidad = Constantes.publico;
                    tipo        = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    nombre      = nodoAtributo.ChildNodes[1].Token.ValueString;
                    int             noPosiciones           = nodoAtributo.ChildNodes[3].ChildNodes.Count;
                    ParseTreeNode[] expresionesDimensiones = getExpresionesArreglo(nodoAtributo.ChildNodes[2]);
                    int             noFilasExpresion       = nodoAtributo.ChildNodes[3].ChildNodes.Count;
                    if (expresionesDimensiones.Length == noPosiciones && noPosiciones == noFilasExpresion)
                    {
                        nuevo = new Atributo(visibilidad, nombre, tipo, Constantes.ARREGLO, noPosiciones, expresionesDimensiones);
                        nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[3]);
                        lista.Add(nuevo);
                    }
                    else
                    {
                        ErrorA err = new ErrorA(Constantes.errorSemantico, "No coinciden numero de dimensiones", nodoAtributo.Token);
                        Form1.errores.addError(err);
                    }
                }
                else if (nodoAtributo.ChildNodes[3].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase))
                {
                    // VISIBILIDAD + TIPO + identificador + LPOSICIONES + ToTerm(";")
                    visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    tipo        = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.ValueString;
                    nombre      = nodoAtributo.ChildNodes[2].Token.ValueString;
                    int             noPosiciones           = nodoAtributo.ChildNodes[3].ChildNodes.Count;
                    ParseTreeNode[] expresionesDimensiones = getExpresionesArreglo(nodoAtributo.ChildNodes[3]);
                    if (noPosiciones == expresionesDimensiones.Length)
                    {//si se puede crear el arreglo
                        nuevo = new Atributo(visibilidad, nombre, tipo, Constantes.ARREGLO, noPosiciones, expresionesDimensiones);
                        lista.Add(nuevo);
                    }
                    else
                    {//error semantico
                        ErrorA err = new ErrorA(Constantes.errorSemantico, "No coinciden numero de dimensiones", nodoAtributo.Token);
                        Form1.errores.addError(err);
                    }
                }
                else
                {
                    /*VISIBILIDAD + TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";") //1
                     */
                    visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    tipo        = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.ValueString;
                    nombre      = nodoAtributo.ChildNodes[2].Token.ValueString;
                    nuevo       = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                    nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[3]);
                    lista.Add(nuevo);
                }
            }//fin de ==4
            else if (noHijos == 3)
            {
                if (nodoAtributo.ChildNodes[0].Term.Name.Equals(Constantes.visibilidad, StringComparison.OrdinalIgnoreCase))
                {
                    //ATRIBUTO.Rule = VISIBILIDAD + TIPO + L_IDS + ToTerm(";")
                    visibilidad = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    tipo        = nodoAtributo.ChildNodes[1].ChildNodes[0].Token.ValueString;
                    foreach (ParseTreeNode item in nodoAtributo.ChildNodes[2].ChildNodes)
                    {
                        nombre = item.Token.Value.ToString();
                        nuevo  = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                        lista.Add(nuevo);
                    }
                }
                else if (nodoAtributo.ChildNodes[2].Term.Name.Equals(Constantes.lposiciones, StringComparison.OrdinalIgnoreCase))
                {
                    //| TIPO + identificador + LPOSICIONES + ToTerm(";")
                    visibilidad = Constantes.publico;
                    nombre      = nodoAtributo.ChildNodes[1].Token.ValueString;
                    tipo        = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    int             noPosiciones           = nodoAtributo.ChildNodes[2].ChildNodes.Count;
                    ParseTreeNode[] expresionesDimensiones = getExpresionesArreglo(nodoAtributo.ChildNodes[2]);
                    if (noPosiciones == expresionesDimensiones.Length)
                    {//si se puede crear el arreglo
                        nuevo = new Atributo(visibilidad, nombre, tipo, Constantes.ARREGLO, noPosiciones, expresionesDimensiones);
                        lista.Add(nuevo);
                    }
                    else
                    {//error semantico
                        ErrorA err = new ErrorA(Constantes.errorSemantico, "No coinciden numero de dimensiones", nodoAtributo.Token);
                        Form1.errores.addError(err);
                    }
                }
                else
                {
                    //| TIPO + identificador + ToTerm("=") + EXPRESION + ToTerm(";") //1
                    visibilidad = Constantes.publico;
                    nombre      = nodoAtributo.ChildNodes[1].Token.ValueString;
                    tipo        = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    nuevo       = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                    nuevo.setExpresionAtributo(nodoAtributo.ChildNodes[2]);
                    lista.Add(nuevo);
                }
            }
            else if (noHijos == 2)
            {
                //TIPO + L_IDS + ToTerm(";")

                visibilidad = Constantes.publico;
                tipo        = nodoAtributo.ChildNodes[0].ChildNodes[0].Token.ValueString;
                foreach (ParseTreeNode item in nodoAtributo.ChildNodes[1].ChildNodes)
                {
                    nombre = item.Token.Value.ToString();
                    nuevo  = new Atributo(visibilidad, nombre, tipo, getTipoAtributo(tipo));
                    lista.Add(nuevo);
                }
            }

            return(lista);
        }
示例#12
0
        /*---  Generacion de tabla de simbolos -------*/


        public List <Simbolo> getSimbolosClase()
        {
            agregarConstructorPorDefecto();

            /*Pasos para simboos de fucniones y metodos:
             * 1. Ingresamos a la tabla de simblos el simbolo de la funcion o metodo
             * 2. Ingresamos el this
             * 3. Ingresamos los parametros
             * 4. ingresamos las declaraciones que se hayan realizado en la funcion
             * 5. ingresamos el return
             * 6. Calculamos el tamanho de metodo y lo vamos a actualizar en la lista
             */
            this.tamanho = atributos.atributos.Count;
            List <Simbolo> retorno  = new List <Simbolo>();
            Simbolo        simClase = new Simbolo(Constantes.noTieneVisi, this.nombre, this.nombre, Constantes.clase, Constantes.noTieneVisi, Constantes.clase, -1, this.tamanho);

            retorno.Add(simClase);
            List <Simbolo> h = generarSimbolosAtributos();

            foreach (Simbolo s in h)
            {
                retorno.Add(s);
            }
            Ambitos ambitos;

            foreach (Funcion func in this.funciones.funciones)
            {
                int           noParametros   = 0;
                List <String> tipoParametros = new List <String>();
                ambitos = new Ambitos();
                ambitos.addAmbito(func.firma);
                apuntador = 0;

                //paso 2
                Simbolo simThis = new Simbolo(Constantes.noTieneVisi, Constantes3D.THIS, Constantes3D.THIS, "", ambitos.getAmbito(), Constantes3D.THIS, apuntador, 1);
                apuntador++;

                //paso 3
                List <Simbolo> simbolosParametros = new List <Simbolo>();
                Simbolo        simTemporal;
                foreach (variable var in func.parametros.parametros)
                {
                    noParametros++;
                    tipoParametros.Add(var.tipo);
                    simTemporal = new Simbolo(Constantes.noTieneVisi, var.nombre, var.tipo, getTipoAtributo(var.tipo), ambitos.getAmbito(), Constantes3D.parametro, apuntador, 1);
                    simbolosParametros.Add(simTemporal);
                    apuntador++;
                }

                //paso 4
                List <Simbolo> lTemporalFuncion = new List <Simbolo>();
                if (func.cuerpo != null)
                {
                    lTemporalFuncion = generarSimbolosMetodo(func.cuerpo, lTemporalFuncion, ambitos);
                }

                //paso 5
                Simbolo simReturn = new Simbolo(Constantes.noTieneVisi, Constantes3D.retorno, Constantes3D.retorno, "", ambitos.getAmbito(), Constantes3D.retorno, apuntador, 1);

                int sizeFun = 1 + simbolosParametros.Count + lTemporalFuncion.Count + 1;
                //paso 1
                Simbolo simFuncion = new Simbolo(func.visibilidad, func.firma, func.tipo, "", this.nombre, func.getRol(), -1, sizeFun, noParametros, func.tiposParametrosCadena, func.nombre);
                retorno.Add(simFuncion);
                retorno.Add(simThis);
                foreach (Simbolo item in simbolosParametros)
                {
                    if (!existe(retorno, item))
                    {
                        retorno.Add(item);
                    }
                    else
                    {
                        ErrorA er = new ErrorA(Constantes.errorSemantico, 0, 0, 0, "Ya existe un simboo con ese nombre, " + item.nombreReal + ", en el ambito " + ambitos.ambitos.Peek());
                        Form1.errores.addError(er);
                    }
                }

                foreach (Simbolo item in lTemporalFuncion)
                {
                    if (!existe(retorno, item))
                    {
                        retorno.Add(item);
                    }
                    else
                    {
                        ErrorA er = new ErrorA(Constantes.errorSemantico, 0, 0, 0, "Ya existe un simboo con ese nombre, " + item.nombreReal + ", en el ambito " + ambitos.ambitos.Peek());
                        Form1.errores.addError(er);
                    }
                }
                retorno.Add(simReturn);
                ambitos.ambitos.Pop();
            }
            return(retorno);
        }
示例#13
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);
        }
示例#14
0
        public clasesDiagrama agregarHerencia()
        {
            clasesDiagrama umlRetorno = new clasesDiagrama();
            Clase          actual;

            for (int i = 0; i < listaClases.Count; i++)
            {
                actual = listaClases.ElementAt(i);
                if (actual.herencia != null)
                {//posee herencia
                    Clase clasePadre = getClase(actual.herencia);
                    Clase temporal   = new Clase();
                    if (clasePadre.lenguaje.Equals(actual.lenguaje, StringComparison.OrdinalIgnoreCase))
                    {
                        // buscamos todos los atributos que sean validos


                        temporal.nombre    = actual.nombre;
                        temporal.herencia  = actual.herencia;
                        temporal.lenguaje  = actual.lenguaje;
                        temporal.tamanho   = actual.tamanho;
                        temporal.apuntador = actual.apuntador;
                        //atributos de la clase padre
                        foreach (Atributo atrTemp in clasePadre.atributos.atributos)
                        {
                            Atributo nuevo      = esValidoAtriHerencia(atrTemp, temporal.nombre);
                            Atributo nuevoSuper = esPadreValidoAtriHerencia(atrTemp, temporal.nombre);

                            if (nuevo != null && nuevoSuper != null)
                            {
                                temporal.addAtributo(nuevoSuper);
                                temporal.addAtributo(nuevo);
                            }
                        }
                        //agregamos los atributos de la clase ya que han sido guardados los de la clase padre

                        foreach (Atributo item in actual.atributos.atributos)
                        {
                            temporal.addAtributo(item);
                        }

                        //agregamos las funciones de la clase padre

                        foreach (Funcion item in clasePadre.funciones.funciones)
                        {
                            Funcion funcNueva      = esValidoFuncHerencia(item, temporal.nombre);
                            Funcion funcNuevaPadre = esPadreValidoFuncHerencia(item, temporal.nombre);
                            if (funcNueva != null && funcNuevaPadre != null)
                            {
                                temporal.addFuncion(funcNuevaPadre);
                                temporal.addFuncion(funcNueva);
                            }
                        }

                        foreach (Funcion item in actual.funciones.funciones)
                        {
                            temporal.funciones.sobreEscribirFunciones(item);
                        }


                        umlRetorno.insertarClase(temporal);
                    }
                    else
                    {
                        ErrorA er = new ErrorA(Constantes.errorSemantico, 0, 0, 0, "La clase " + actual.nombre + " es de otro lenguaje a la clase " + clasePadre.nombre);
                        Form1.errores.addError(er);
                    }
                }
                else
                {
                    umlRetorno.insertarClase(actual);
                }
            }

            return(umlRetorno);
        }
示例#15
0
 public EitherA(ErrorA left) : base(left)
 {
 }