예제 #1
0
        public override Result GetC3D(Ent e, bool funcion, bool ciclo, bool isDeclaracion, bool isObjeto, LinkedList <Error> errores)
        {
            if (!isDeclaracion)
            {
                Debugger(e, "Import");
            }

            string archivo = DirActual + Direccion.Substring(1, Direccion.Length - 2);

            archivo = archivo.Replace("\\\\", "\\");
            archivo = archivo.Replace("/", "");

            if (Path.HasExtension(archivo))
            {
                if (Path.GetExtension(archivo).ToLower().Equals(".colette"))
                {
                    StreamReader reader = null;

                    try
                    {
                        reader = new StreamReader(archivo);
                        string contenido = reader.ReadToEnd();

                        if (contenido != null)
                        {
                            if (!contenido.Equals(string.Empty))
                            {
                                AnalizadorColette analizador = new AnalizadorColette();

                                if (analizador.AnalizarEntrada(contenido))
                                {
                                    Arbol arbol = (Arbol)analizador.GenerarArbol(analizador.Raiz.Root);

                                    if (arbol != null)
                                    {
                                        Sentencias = new LinkedList <Nodo>();
                                        LinkedList <Import> imports = new LinkedList <Import>();

                                        foreach (Nodo n in arbol.Sentencias)
                                        {
                                            if (n is Import import)
                                            {
                                                import.DirActual = DirActual;
                                                import.GetC3D(e, false, false, false, false, errores);
                                                imports.AddLast(import);
                                            }
                                            else
                                            {
                                                Sentencias.AddLast(n);
                                            }
                                        }

                                        foreach (Import import in imports)
                                        {
                                            if (import.Sentencias != null)
                                            {
                                                foreach (Nodo n in import.Sentencias)
                                                {
                                                    Sentencias.AddLast(n);
                                                }
                                            }
                                        }
                                    }
                                }

                                for (int i = 0; i < analizador.Raiz.ParserMessages.Count(); i++)
                                {
                                    LogMessage m = analizador.Raiz.ParserMessages.ElementAt(i);
                                    if (m.Message.ToString().Contains("character"))
                                    {
                                        errores.AddLast(new Error("Léxico", m.Message.Replace("Invalid character", "Carácter inválido"), (m.Location.Line + 1), (m.Location.Column + 1)));
                                    }
                                    else
                                    {
                                        errores.AddLast(new Error("Sintáctico", m.Message.Replace("Syntax error, expected:", "Error de sintáxis, se esperaba:"), (m.Location.Line + 1), (m.Location.Column + 1)));
                                    }
                                }

                                return(null);
                            }
                        }
                        errores.AddLast(new Error("Semántico", "Ocurrió un error leyendo el archivo " + archivo + ".", Linea, Columna));
                    }
                    catch (Exception)
                    {
                        errores.AddLast(new Error("Semántico", "Ocurrió un error abriendo el archivo " + archivo + ".", Linea, Columna));
                    }
                }
                else
                {
                    errores.AddLast(new Error("Semántico", "La extensión del archivo debe ser .colette " + archivo + ".", Linea, Columna));
                }
            }
            else
            {
                errores.AddLast(new Error("Semántico", "No es un archivo lo que se desea importar" + archivo + ".", Linea, Columna));
            }

            return(null);
        }