public void CompilacionGarGarIncorrectaConTexto()
        {
            Compilador compilador = new Compilador();

            ResultadoCompilacion res = compilador.Compilar(PROGRAMA_ERRONEO);

            Assert.IsFalse(res.CompilacionGarGarCorrecta);
        }
        public void CompilacionGarGarVacia()
        {
            Compilador compilador = new Compilador();

            ResultadoCompilacion res = compilador.Compilar("");

            Assert.IsFalse(res.CompilacionGarGarCorrecta);
        }
        public void CompilacionGarGarCorrectaBasica()
        {
            Compilador compilador = new Compilador(true, "basica");

            ResultadoCompilacion res = compilador.Compilar(PROGRAMA_BASICO);

            Assert.IsTrue(res.CompilacionGarGarCorrecta, ObtenerErrores(res));
            Assert.IsTrue(res.ResultadoCompPascal.CompilacionPascalCorrecta);
        }
        private string ObtenerErrores(ResultadoCompilacion res)
        {
            StringBuilder strBldr = new StringBuilder();

            foreach (var item in res.ListaErrores)
            {
                strBldr.AppendLine(string.Format("{0},{1}: {2}", item.Fila, item.Columna, item.Mensaje.Descripcion));
            }
            return(strBldr.ToString());
        }
        public void CompilacionCorrectaTest()
        {
            Compilador compilador = new Compilador();

            string resourceName = "UnitTestCompiladorGarGar.Programas.test.gar";
            string programa     = Utilidades.FileManager.LeerArchivoEnteroDeAssembly(Assembly.GetExecutingAssembly(), resourceName);

            ResultadoCompilacion res = compilador.Compilar(programa);

            Assert.IsTrue(res.CompilacionGarGarCorrecta, ObtenerErrores(res));

            Assert.IsTrue(res.ResultadoCompPascal.CompilacionPascalCorrecta);
        }
        public void CompilacionErrorLexicoPrimerCaracter()
        {
            Compilador compilador = new Compilador();

            string resourceName = "UnitTestCompiladorGarGar.Programas.testErrorLexico.gar";
            string programa     = Utilidades.FileManager.LeerArchivoEnteroDeAssembly(Assembly.GetExecutingAssembly(), resourceName);

            ResultadoCompilacion res = compilador.Compilar(programa);



            Assert.IsTrue(res.ListaErrores[0].Mensaje.CodigoGlobal == 43);
        }
        private void PruebaSintactica(int errorPretendido, string pruebaBis = "")
        {
            Compilador compilador = new Compilador();

            string resourceName = string.Format("UnitTestCompiladorGarGar.Programas.ErroresSintacticos.error{0}{1}.gar", errorPretendido, pruebaBis);
            string programa     = Utilidades.FileManager.LeerArchivoEnteroDeAssembly(Assembly.GetExecutingAssembly(), resourceName);

            ResultadoCompilacion res = compilador.Compilar(programa);

            Assert.IsFalse(res.CompilacionGarGarCorrecta,
                           string.Format("La compilacion da correcta y esperaba error {0}", errorPretendido));

            Assert.IsTrue(res.ListaErrores[0].Mensaje.CodigoGlobal == errorPretendido,
                          string.Format("Error {0} y esperaba {1}. Error: {2}",
                                        res.ListaErrores[0].Mensaje.CodigoGlobal, errorPretendido, res.ListaErrores[0].Mensaje.Descripcion));
        }
        public void CompilacionMenorTresSegundos()
        {
            Compilador compilador = new Compilador("validacionesSemanticasCorrectas");

            string resourceName = "UnitTestCompiladorGarGar.Programas.validacionesSemanticasCorrectas.gar";
            string programa     = Utilidades.FileManager.LeerArchivoEnteroDeAssembly(Assembly.GetExecutingAssembly(), resourceName);

            ResultadoCompilacion res = compilador.Compilar(programa);


            Assert.IsTrue(res.CompilacionGarGarCorrecta, ObtenerErrores(res));

            Assert.IsTrue(res.ResultadoCompPascal.CompilacionPascalCorrecta);

            Assert.IsTrue(res.TiempoCompilacionTotal < 3);
        }
        private void CompilarCodigoIntermedio(ResultadoCompilacion res)
        {
            if (res.CompilacionGarGarCorrecta)
            {
                res.ArbolSemanticoResultado = this.analizadorSintactico.ArbolSemantico;

                long timeStampCod = Stopwatch.GetTimestamp();
                res.CodigoPascal = res.ArbolSemanticoResultado.CalcularCodigo(modoDebug);

                Dictionary <int, int> bindeoLineasEntrePascalYGarGar = BindearLineas(res.CodigoPascal.Split(new string[] { "\r\n" }, StringSplitOptions.None));


                res.TiempoGeneracionCodigo = ((float)(Stopwatch.GetTimestamp() - timeStampCod)) / ((float)Stopwatch.Frequency);

                timeStampCod = Stopwatch.GetTimestamp();
                res.ArchTemporalCodigoPascal        = CrearArchivoTemporal(res.CodigoPascal);
                res.ArchTemporalCodigoPascalConRuta = Path.Combine(DirectorioTemporales, res.ArchTemporalCodigoPascal);
                res.TiempoGeneracionTemporalCodigo  = ((float)(Stopwatch.GetTimestamp() - timeStampCod)) / ((float)Stopwatch.Frequency);

                try
                {
                    timeStampCod = Stopwatch.GetTimestamp();



                    ResultadoCompilacionPascal resPas = CompilarPascal(res.ArchTemporalCodigoPascalConRuta, bindeoLineasEntrePascalYGarGar);

                    res.ResultadoCompPascal        = resPas;
                    res.ArchEjecutable             = resPas.NombreEjecutable;
                    res.ArchEjecutableConRuta      = Path.Combine(DirectorioEjecutables, res.ArchEjecutable);
                    res.TiempoGeneracionEjecutable = ((float)(Stopwatch.GetTimestamp() - timeStampCod)) / ((float)Stopwatch.Frequency);

                    res.GeneracionEjectuableCorrecto = resPas.CompilacionPascalCorrecta;
                }
                catch
                {
                    res.GeneracionEjectuableCorrecto = false;
                }

                BorrarTemporales();
            }
        }
        public ResultadoCompilacion Compilar(string texto)
        {
            Stopwatch            temporizador = Stopwatch.StartNew();
            ResultadoCompilacion res          = new ResultadoCompilacion();

            if (texto != string.Empty)
            {
                try
                {
                    long timeStamp = Stopwatch.GetTimestamp();
                    long timeStampPaso;

                    ReiniciarCompilador();

                    res.TiempoGeneracionAnalizadorSintactico = temporizador.Elapsed.TotalSeconds;

                    List <PasoDebugTiempos> tiempos = new List <PasoDebugTiempos>();

                    int i = 1;

                    long timeStampLex = Stopwatch.GetTimestamp();
                    CargarAnalizadorLexico(texto);
                    float tiempoCargarLexico = ((float)(Stopwatch.GetTimestamp() - timeStampLex)) / ((float)Stopwatch.Frequency);

                    bool pararComp = false;
                    GlobalesCompilador.TipoError tipoError = GlobalesCompilador.TipoError.Ninguno;

                    while (!this.analizadorSintactico.EsFinAnalisisSintactico() && !pararComp)
                    {
                        timeStampPaso = Stopwatch.GetTimestamp();
                        List <ErrorCompilacion> retorno = this.analizadorSintactico.AnalizarSintacticamenteUnPaso();
                        float tiempoAnalizSint          = ((float)(Stopwatch.GetTimestamp() - timeStampPaso)) / ((float)Stopwatch.Frequency);

                        if (retorno.Count > 0)
                        {
                            foreach (var item in retorno)
                            {
                                switch (item.TipoError)
                                {
                                case GlobalesCompilador.TipoError.Sintactico:
                                    tipoError = item.TipoError;
                                    res.ListaErrores.Add(item);
                                    pararComp = pararComp || item.PararCompilacion;
                                    break;

                                case GlobalesCompilador.TipoError.Semantico:
                                    tipoError = item.TipoError;
                                    res.ListaErrores.Add(item);
                                    pararComp = pararComp || item.PararCompilacion;
                                    break;

                                case GlobalesCompilador.TipoError.Ninguno:
                                    tipoError = item.TipoError;
                                    break;
                                }
                            }
                        }

                        if (modoDebug)
                        {
                            PasoCompilacion paso = new PasoCompilacion(this.analizadorSintactico.Pila.ToString(),
                                                                       this.analizadorSintactico.CadenaEntrada.ToString(),
                                                                       tipoError);

                            res.ListaDebugSintactico.Add(paso);
                        }

                        float numPaso = ((float)(Stopwatch.GetTimestamp() - timeStampPaso)) / ((float)Stopwatch.Frequency);

                        tiempos.Add(new PasoDebugTiempos()
                        {
                            NumPaso = i, TiempoAnalizadorSint = tiempoAnalizSint, TiempoAnalizadorTot = numPaso
                        });;
                        i++;
                    }

                    if (this.analizadorSintactico.EsFinAnalisisSintactico() && res.ListaErrores.Count == 0)
                    {
                        res.CompilacionGarGarCorrecta = true;
                    }

                    CompilarCodigoIntermedio(res);
                }
                catch (Exception ex)
                {
                    string error = null;

                    if (modoDebug)
                    {
                        error = string.Format("{0}: \r\n {1}", ex.Message, ex.StackTrace);
                    }

                    res.CompilacionGarGarCorrecta = false;
                    res.ListaErrores.Add(new ErrorCompilacion(new ErrorDesconocido(error), GlobalesCompilador.TipoError.Ninguno, 0, 0));
                }

                res.TiempoCompilacionTotal = temporizador.Elapsed.TotalSeconds;
            }
            else
            {
                //No hay nada para compilar
                res.ListaErrores.Add(new ErrorCompilacion(
                                         new ErrorNoHayProgramaParaCompilar(),
                                         GlobalesCompilador.TipoError.Sintactico,
                                         GlobalesCompilador.UltFila,
                                         GlobalesCompilador.UltCol,
                                         false)
                                     );
            }

            return(res);
        }
Exemple #11
0
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static void Main(string[] args)
        {
            try
            {
                //Compilador comp = new Compilador();

                //Application.Run(comp);

                var options = new Options();
                var result  = CommandLine.Parser.Default.ParseArguments <Options>(args);


                if (!result.Errors.Any())
                {
                    if (File.Exists(result.Value.InputFile))
                    {
                        using (StreamReader reader = new StreamReader(result.Value.InputFile))
                        {
                            string textoCompilar = reader.ReadToEnd();

                            //Compilador compilador = new Compilador(false, Globales.ConstantesGlobales.PathEjecucionAplicacion, Globales.ConstantesGlobales.PathEjecucionAplicacion, result.Value.ExeFile);
                            Compilador           compilador = new Compilador(false, Path.GetTempPath(), Path.GetTempPath(), result.Value.ExeFile);
                            ResultadoCompilacion res        = compilador.Compilar(textoCompilar);


                            if (res.CompilacionGarGarCorrecta && res.ResultadoCompPascal != null &&
                                res.ResultadoCompPascal.CompilacionPascalCorrecta)
                            {
                                Console.WriteLine("Compilacion exitosa");
                            }
                            else
                            {
                                Console.WriteLine("Error de compilacion");
                                foreach (var error in res.ListaErrores)
                                {
                                    Console.WriteLine(string.Format("<{0},{1}> {2}", error.Fila, error.Columna, error.Mensaje.Descripcion));
                                }
                            }
                        }
                    }
                }

                //if (args != null)
                //{


                //    if (args.Length > 0)
                //    {
                //        List<string> argumentos = new List<string>(args);
                //    }
                //    else
                //    {
                //        Console.WriteLine("Coloque el parametro -? para ayuda");
                //    }
                //}
                //else
                //{
                //    Console.WriteLine("Coloque el parametro -? para ayuda");
                //}
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error fatal en el compilador.");
                Console.WriteLine(ex.Message);
            }
        }