/// <summary> /// Guarda la sentencia Analizada en la lista de Tokens General /// </summary> /// <param name="lista"></param> /// <returns></returns> private Cola GuardarTokens(ListaSimple lista) { //Declara la Cola de salida Cola instrucciones = new Cola("Instrucciones"); //El loop verificará que no este vacia la lista //Sacará de la lista los tokens y los guardará en la lista general while (!lista.EsVacia()) { //Saca el primer dato de la lista y lo caste a Token Token temp = (Token)lista.Listar(); //Guarda la instruccion a realizar instrucciones.Encolar(temp.lexema); //Guarda el token temp en la lista general, con diferente id //Verifica si el token es un error y lo guarda en otra lista if (temp.token.Equals("Error")) { err.Enlistar(new Error(err.GetLargo() + 1, temp.lexema, temp.fila, temp.columna, "Error léxico")); } else { token.Enlistar(new Token(token.GetLargo() + 1, temp.lexema, temp.fila, temp.columna, temp.token)); } } return(instrucciones); }
/// <summary> /// Determina si se ejecuta o no una sentencia Analizada. /// Si en la lista se encuentra un Error entonces no /// </summary> /// <param name="lista"></param> /// <returns></returns> private bool Escanear(ListaSimple lista) { //Realiza una copia de la lista Nodo aux = lista.inicio; //Recorre la lista siempre que existan nodos válidos while (aux != null) { //Castea el objeto a Token Token temp = (Token)aux.objeto; //Verifica que no existan Tokens con error if (temp.token.Equals("Error")) { //Informa al usuario de cual es el error //No se reconoce <lexema>. [Lín ##, Col ##], TxtArea.Text += "Error en <" + temp.lexema + ">. [Lín " + temp.fila + ", Col " + temp.columna + "]"; //Si existe un token error devuelve false return(false); } else { //Si no pasa al siguiente nodo aux = aux.siguiente; } } //El loop terminó y no existe error la sentencia es válida léxicamente return(true); }
public void Insertar(Object Dato, String Clave) { Posicion = DispersionMod(Clave); if (tabla[Posicion] == null) { tabla[Posicion] = new ListaSimple(); } tabla[Posicion].insertarCabezaLista(Dato); cont++; }
/// <summary> /// Incializa todo el formulario /// </summary> public Main() { InitializeComponent(); TxtArea.Text = " PRIMERA PRACTICA DE LABORATORIO" + Environment.NewLine + "© LP-CLOUD [Lenguajes Formales y de Programación] 1S 2018" + Environment.NewLine; pdf = new ListaSimple("PDF"); fila = new ListaSimple("Fila"); token = new ListaSimple("Token"); texto = new Cola("Texto"); imagen = new Cola("Imagen"); tabla = new Cola("Tabla"); err = new ListaSimple("Error"); ///Agrega SFOG<< y coloca el puntero al final TxtArea.Text += Environment.NewLine + iniciales; TxtArea.Select(TxtArea.Text.Length, 0); }
/// <summary> /// Crea un String con el codigo HTML /// </summary> /// <param name="token"></param> /// <param name="err"></param> /// <returns></returns> public String ReporteTokens(ListaSimple token, ListaSimple err) { //Aquí se alojará el string final a retornar string htmlString = ""; //Ayudará a crear el string a retornar StringBuilder htmlBuilder = new StringBuilder(); //Crea un html htmlBuilder.Append("<!DOCTYPE html>"); htmlBuilder.Append("<html>"); //Crea un css htmlBuilder.Append("<style type=\"text / css\">"); htmlBuilder.Append(".token {border-collapse:collapse;border-spacing:0;border-color:#aaa;margin:0px auto;}"); htmlBuilder.Append(".token td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-color:#aaa;color:#333;background-color:#fff;border-top-width:1px;border-bottom-width:1px;}"); htmlBuilder.Append(".token th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-color:#aaa;color:#fff;background-color:#f38630;border-top-width:1px;border-bottom-width:1px;}"); htmlBuilder.Append(".err {border-collapse:collapse;border-spacing:0;border-color:#999;margin:0px auto;}"); htmlBuilder.Append(".err td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-color:#999;color:#444;background-color:#F7FDFA;border-top-width:1px;border-bottom-width:1px;}"); htmlBuilder.Append(".err th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:0px;overflow:hidden;word-break:normal;border-color:#999;color:#fff;background-color:#26ADE4;border-top-width:1px;border-bottom-width:1px;}"); htmlBuilder.Append(".tg-f4we{font-weight:bold;font-size:15px;font-family:Arial, Helvetica, sans-serif !important;;text-align:center;vertical-align:top}"); htmlBuilder.Append(".tg-cjcd{font-style:italic;font-size:12px;font-family:Arial, Helvetica, sans-serif !important;;vertical-align:top}"); htmlBuilder.Append(".tg-do2s{font-size:12px;font-family:Arial, Helvetica, sans-serif !important;;vertical-align:top}"); htmlBuilder.Append("</style>"); //Permite la utilización de acentos utf-8 htmlBuilder.Append("<head>"); htmlBuilder.Append("<meta charset =\"UTF-8\">"); htmlBuilder.Append("<title>"); htmlBuilder.Append("Reporte-"); htmlBuilder.Append(Guid.NewGuid().ToString()); htmlBuilder.Append("</title>"); htmlBuilder.Append("</head>"); htmlBuilder.Append("<body>"); /// ///Inicia tabla de TOKEN /// htmlBuilder.Append("<table class= \"token\">"); htmlBuilder.Append("<tr>" + "<th class=\"tg-f4we\" colspan=\"5\">TOKEN</th> " + "</tr>"); htmlBuilder.Append("<tr>" + "<td class=\"tg-cjcd\">#<br></td>" + "<td class=\"tg-cjcd\">LEXEMA<br></td>" + "<td class=\"tg-cjcd\">FILA</td>" + "<td class=\"tg-cjcd\">COLUMNA</td>" + "<td class=\"tg-cjcd\">TOKEN</td>" + "</tr>"); ///Realiza una copia de la lista de TOKENS Nodo aux = token.inicio; ///Agrega los elementos de la lista a la tabla recién creada while (aux != null) { LFP_P1.ADF.Token cast = (LFP_P1.ADF.Token)aux.objeto; htmlBuilder.Append("<tr>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.indice + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.lexema + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.fila + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.columna + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.token + "</td>"); htmlBuilder.Append("</tr>"); aux = aux.siguiente; } htmlBuilder.Append("<tr>" + "<th class=\"tg-cjcd\" colspan=\"5\"> ---------- Fin de línea. " + token.GetLargo() + " tokens ---------- </th> " + "</tr>"); htmlBuilder.Append("</table><br><br>"); /// ///Inicia tabla de ERRORES /// htmlBuilder.Append("<table class= \"err\">"); htmlBuilder.Append("<tr>" + "<th class=\"tg-f4we\" colspan=\"5\">ERROR</th> " + "</tr>"); htmlBuilder.Append("<tr>" + "<td class=\"tg-cjcd\">#<br></td>" + "<td class=\"tg-cjcd\">LEXEMA<br></td>" + "<td class=\"tg-cjcd\">FILA</td>" + "<td class=\"tg-cjcd\">COLUMNA</td>" + "<td class=\"tg-cjcd\">ERROR</td>" + "</tr>"); ///Realiza una copia de la lista de TOKENS aux = err.inicio; ///Agrega los elementos de la lista a la tabla recién creada while (aux != null) { LFP_P1.ADF.Error cast = (LFP_P1.ADF.Error)aux.objeto; htmlBuilder.Append("<tr>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.indice + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.lexema + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.fila + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.columna + "</td>"); htmlBuilder.Append("<td class=\"tg-do2s\">" + cast.error + "</td>"); htmlBuilder.Append("</tr>"); aux = aux.siguiente; } htmlBuilder.Append("<tr>" + "<th class=\"tg-cjcd\" colspan=\"5\"> ---------- Fin de línea. " + err.GetLargo() + " errores ---------- </th> " + "</tr>"); htmlBuilder.Append("<tr>" + "<th class=\"tg-f4we\" colspan=\"5\"> -1 ► Durante tiempo de ejecución </th> " + "</tr>"); htmlBuilder.Append("</table><br><br>"); htmlBuilder.Append("</body>"); htmlBuilder.Append("</html>"); //Crea un string de todo lo escrito anteriormente htmlString = htmlBuilder.ToString(); return(htmlString); }
/// <summary> /// Toma todas las colas y listas de la edición, y conforme el indiceEdicion, va editando el PDF /// de lo que contengan las colas y listas /// Algoritmo: /// Cada una de los objeto alojados en las colas y listas, tiene un índice /// ese indice va incrementando segun se vaya editado el PDF en general, /// A la larga puede que los indices queden así: /// -> Texto {1,4,8,9} /// -> Imagen {2,3,5} /// -> Tabla {6,7} /// El ciclo for que contiene el metodo va recorriendo el indice de cada objeto alojado /// en las listas/colas y las va agregando al PDF, en el orden en el que fue editado originalmente el PDF /// a través de comandos /// Conforme se vayan agregando las colas/listas, estas se van vaciando /// </summary> /// <param name="url"></param> /// <param name="indiceEdicion"></param> /// <param name="Textos"></param> /// <param name="Imagenes"></param> /// <param name="Tablas"></param> /// <param name="Filas"></param> /// <returns>Respuesta del sistema</returns> public String GenerarPDF(String url, int indiceEdicion, Cola Textos, Cola Imagenes, Cola Tablas, ListaSimple Filas) { //Se guardará la respuesta del sistema String respuesta = ""; //Aquí se guardarán las intancias que ayudaran en la creación del PDF Document doc = null; FileStream fs = null; PdfWriter writer = null; //Edita el PDF en un entorno a prueba de idiotas :v try { //Crea el documento pdf (lo instancia) doc = new Document(PageSize.A4, 30f, 30f, 30f, 30f); //Prepara el documento para su escritura fs = new FileStream(url + "\\" + nombre + ".pdf", FileMode.Create, FileAccess.Write, FileShare.None); //Determina la localización del PDF dentro de writer = PdfWriter.GetInstance(doc, fs); if (!Textos.EsVacia() || !Imagenes.EsVacia() || !Tablas.EsVacia()) { //Abre el documento para editarlo doc.Open(); } for (int i = 1; i <= indiceEdicion; i++) { //Verifica si la cola está vacía if (!Textos.EsVacia()) { //Castea a Texto Texto text = (Texto)Textos.ShutearPrimero(); //Verifica que el indice guardado coincida con la <i> if (text.indice == i) { //Agrega texto al PDF doc.Add(text.texto); //Elimna información de la lista Textos.Desencolar(); } } //Verifica si la cola está vacía if (!Imagenes.EsVacia()) { //Esta instancia ayudara a agregar imagenes si las hubiera iTextSharp.text.Image jpg; //Caste a Imagen Imagen image = (Imagen)Imagenes.ShutearPrimero(); //Verifica que el indice guardado coincida con la <i> if (image.indice == i) { //Aloja la referencia guardada jpg = image.imagen; //Encaja la imagen en el documento jpg.ScaleToFit(400f, 300f); //Deja un espacio antes y despues de la imagen jpg.SpacingBefore = 12f; jpg.SpacingAfter = 12f; //Establece al alineacion jpg.Alignment = image.alineacion; //Agrega la imagen al PDF doc.Add(jpg); //Elimina infomación de la cola Imagenes.Desencolar(); } } //Verifica si la cola está vacía if (!Tablas.EsVacia()) { //Esta instancia ayudara a agrega tablas si las hubiera iTextSharp.text.pdf.PdfPTable pTable; //Catea a Tabla Tabla table = (Tabla)Tablas.ShutearPrimero(); //Verifica que el indice guardado coincida con la <i> if (table.indice == i) { //Aloja la referencia guardada pTable = new PdfPTable(1) { //Alinea la tabla HorizontalAlignment = Element.ALIGN_CENTER, //Espacio antes y despues SpacingBefore = 12f, SpacingAfter = 12f }; //Añade el encabezado PdfPCell encabezado = new PdfPCell(new Phrase(table.encabezado)) { Colspan = 1, //Indica cuantas columna se combinan HorizontalAlignment = 1 //Indica la alineación de la tabla }; //Añade el encabezado a la tabla pTable.AddCell(encabezado); //Busca en la lista de Filas todas las filas relacionadas for (int j = 0; j < Filas.GetLargo(); j++) { //Busca una Fila (desde adelante hasta atrás) que tenga el nombre de la Tabla Fila auxRow = Filas.BuscarFila(table.nombre); //Verifica que auxRow no sea nulo if (Filas.Buscar(auxRow)) { //Agrega la Fila almacenada en Filas que se relacionen con la tabla en cuestión :v pTable.AddCell(auxRow.textoplano); //Elimina la Fila de la Lista Filas.Remover(auxRow); } } //Añade la tabla al documento doc.Add(pTable); //Elimina información de la Cola Tablas.Desencolar(); } } } } catch (Exception ex) //Ocurre un error { respuesta += "La escritura de archivo PDF se detuvo. Posible pérdida de datos " + ex.Message; } finally { try { //Si la instancia doc no es nula intentará cerrarla if (doc != null) { doc.Close(); respuesta += "Archivo PDF creado con éxito. Absolute Path -> " + url + "\\" + nombre + ".pdf"; } } catch (Exception ex2) { //Ocurre un error al cerrar respuesta += Environment.NewLine + "No se pudo cerrar la escritura de PDF. " + ex2.Message; } } return(respuesta); }
/// <summary> /// Esta es la joya de la corona. (la corona es el programa en si) /// Aqui se realiza el análisis léxico a través de AFD -Automata Finito Determinista- /// </summary> /// <param name="cadena"></param> /// <returns></returns> public ListaSimple AnalizarCadena(string cadena) //, ListaSimple listaSimple) { //Levara el control de los estados int estadoAceptacion = 0; //Guardara temporalmente los caracteres de la cadena ingresada char cadenaCaracter; //Se eliminan espacio al principio y al final //cadena = cadena.Trim(); //Almacenará los caracteres que se van analizando String cadenaAceptada = ""; //Declara el arrayliste que contendrá los tokens almacenados ListaSimple listaToken = new ListaSimple("Token"); //A través del for se analizará caracter por caracter for (int i = 0; i < cadena.Length; i++) { cadenaCaracter = cadena[i]; //Console.WriteLine(cadenaCaracter); switch (estadoAceptacion) { case 0: //MAYUSCULAS o minusculas o guión bajo o numeros if ((cadenaCaracter >= 65 && cadenaCaracter <= 90) || (cadenaCaracter >= 97 && cadenaCaracter <= 122) || cadenaCaracter == 95 || (cadenaCaracter >= 48 && cadenaCaracter <= 57)) { //Se mantiene en el estado inicial; estadoAceptacion = 0; //Agrega el caracter a la cadena Aceptada cadenaAceptada += cadenaCaracter; //Aumenta la columna column++; } //Salto de línea else if (cadenaCaracter == 10 || cadenaCaracter == 11) { //Mantiene el estado de Aceptacion estadoAceptacion = 0; //Agrega lo que hay hasta ahora en la cadenaAceptada if (!string.IsNullOrEmpty(cadenaAceptada) || !cadenaAceptada.Equals("")) { Console.WriteLine(estadoAceptacion + " -> " + cadenaAceptada); listaToken.Enlistar(new Token(listaToken.GetLargo() + 1, cadenaAceptada, row, column - cadenaAceptada.Length, 0)); } //Aumenta la línea row++; //Empieza nueva columna column = 0; //Limipia la cadena para aceptar otro lexema cadenaAceptada = ""; } //Espacio y tab else if (cadenaCaracter == 32 || cadenaCaracter == 9) { //Mantiene el estado de Aceptacion estadoAceptacion = 0; //Agrega lo que hay hasta ahora en la cadenaAceptada if (!string.IsNullOrEmpty(cadenaAceptada) || !cadenaAceptada.Equals("")) { Console.WriteLine(estadoAceptacion + " -> " + cadenaAceptada); listaToken.Enlistar(new Token(listaToken.GetLargo() + 1, cadenaAceptada, row, column - cadenaAceptada.Length, 0)); } //Aumenta la columna column++; //Limipia la cadena para aceptar otro lexema cadenaAceptada = ""; } //Apostofre else if (cadenaCaracter == 39) { //Limpia la cadena para aceptar la ruta cadenaAceptada = ""; //Aumenta la columna column++; //Cambia el estado de Aceptacion estadoAceptacion = 1; } //Comillas else if (cadenaCaracter == 34) { //Limpia la cadena para aceptar el texto cadenaAceptada = ""; //Aumenta la columna column++; //Cambia el estado de Aceptación estadoAceptacion = 2; } //Se produce un error léxico else { //Simplemente Agrega el caracter y el error se determinará en las siguientes fases cadenaAceptada += cadenaCaracter; column++; } break; case 1: //Apostrofe if (cadenaCaracter == 39) { Console.WriteLine(estadoAceptacion + " -> " + cadenaAceptada); //Debe agregar lo que hay hasta ahora en la cadenaAceptada listaToken.Enlistar(new Token(listaToken.GetLargo() + 1, cadenaAceptada, row, column - cadenaAceptada.Length, "Ruta")); //Limpia la cadena para aceptar un nuevo lexema cadenaAceptada = ""; //Aumenta la columna column++; //Regresa el estado de Aceptacion estadoAceptacion = 0; } else { //Guarda lo que esta en la cadena cadenaAceptada += cadenaCaracter; //Aumenta la columna column++; //Mantiene el estado de Aceptacion estadoAceptacion = 1; } break; case 2: //Comillas if (cadenaCaracter == 34) { Console.WriteLine(estadoAceptacion + " -> " + cadenaAceptada); //Debe agregar lo que hay hasta ahora en la cadenaAceptada listaToken.Enlistar(new Token(listaToken.GetLargo() + 1, cadenaAceptada, row, column - cadenaAceptada.Length, "Texto")); //Limpia la cadena para aceptar un nuevo lexema cadenaAceptada = ""; //Aumenta la columna column++; //Regresa el estado de Aceptacion estadoAceptacion = 0; } else { //Guarda lo que esta en la cadena cadenaAceptada += cadenaCaracter; //Mantiene el estado de Aceptacion estadoAceptacion = 2; //Aumenta la columna column++; } break; } } //Guarda lo último que se encuentra en la cadena si fuera necesario if (!String.IsNullOrEmpty(cadenaAceptada)) { //Console.WriteLine(cadenaAceptada); //Debe agregar lo que hay en la cadenaAceptada Console.WriteLine(estadoAceptacion + " -> " + cadenaAceptada); listaToken.Enlistar(new Token(listaToken.GetLargo() + 1, cadenaAceptada, row, column, estadoAceptacion)); } //Devuelve la ListaSimple de token return(listaToken); }
/// <summary> /// Consulta los Tokens de la cola recibida y determina la lista en donde guardar los argumentos /// </summary> /// <param name="instrucciones"></param> private void EjecutarToken(Cola instrucciones) { //Convierte en un array de String la Cola recibida para facilitar su acceso string[] instruccion = instrucciones.VolverArray(); // = (string)instrucciones.Desencolar(); //A través de la instrucción del primer espacio determina que hacer con lo contenido en el resto del Array switch (instruccion[0]) { //1 case "iniciarA": if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) //Verifica que no haya ya un PDF iniciado { //Intentará instanciar un PDF try { //Verifica que no existan nombres duplicados if (!pdf.Buscar(pdf.BuscarPDF(instruccion[1]))) { //Crea la instancia de PDF pdf.Enlistar(new PDF(pdf.GetLargo() + 1, instruccion[1])); //Informa al usuario de la creacion de la instancia PDF TxtArea.Text += Environment.NewLine + "Instancia " + instruccion[1] + " creada"; } else { //Si existe duplicado se informa al usuario TxtArea.Text += Environment.NewLine + "El PDF " + instruccion[1] + " ya existe. Consulte el Manual de Usuario <mostrar> <ManualUsuario>"; //Agrega error a la lista de errores err.Enlistar(new Error(err.GetLargo() + 1, instruccion[1], -1, instruccion[0].Length + 2, "Nombre <PDF> Duplicado")); } } catch (IndexOutOfRangeException) { //Informa al error de un error (generico) sintáctico TxtArea.Text += Environment.NewLine + "Se esperaba Nombre"; //No hay argumentos después de iniciar err.Enlistar(new Error(err.GetLargo() + 1, null, -1, instruccion[0].Length + 2, "Se esperaba Nombre")); } } else { //Si ya un PDF ingresado se informa al usuario TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. Consulte el Manual de Usuario <mostrar> <ManualUsuario>"; //Agrega el error a la lista err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 1, "Error de Entorno. Hay un PDF enfocado")); } break; //2 case "ingresarAPdf": //Busca el PDF en la lista de PDF, si existe focusedPDF = instruccion[1]. Sino informa al usuario if (pdf.Buscar(pdf.BuscarPDF(instruccion[1]))) { //Pone en global el nombre del pdf focusedPDF = instruccion[1]; //Informa al usuario TxtArea.Text += Environment.NewLine + "Instancia " + instruccion[1] + " enfocada"; } else { //Informa al usuario de que no se pudo encontrar el PDF en cuestión TxtArea.Text += Environment.NewLine + "No se pudo encontrar el PDF " + instruccion[1] + ". Intente iniciarA " + instruccion[1] + " y pruebe de nuevo"; //Agrega al error a la lista err.Enlistar(new Error(err.GetLargo() + 1, instruccion[1], -1, instruccion[0].Length + 2, "PDF no se encontró")); } break; //3 case "crear": //Determina el largo del String[], si == 3 entonces solo crea, si == 4 abre de una vez el PDF if (pdf.Buscar(pdf.BuscarPDF(focusedPDF))) { //Obtiene la instancia de PDF LFP_P1.IO.PDF aux = pdf.BuscarPDF(focusedPDF); //Genera el PDF TxtArea.Text += Environment.NewLine + aux.GenerarPDF(new Ruta().GetAbsolutePath(instruccion[2]), this.indiceEdicion, this.texto, this.imagen, this.tabla, this.fila); //Si Abrir esta presente lo abre if (instruccion.Length == 4 && instruccion[3].Equals("Abrir")) { TxtArea.Text += Environment.NewLine + aux.AbrirPDF(new Ruta().GetAbsolutePath(instruccion[2]) + (char)92 + aux.nombre + ".pdf"); } //Elimina el PDF de la lista pdf.Remover(aux); //Desenfoca el PDF focusedPDF = null; //Reinicia el indice this.indiceEdicion = 1; } else { //Sino informa al usuario TxtArea.Text += Environment.NewLine + "PDF sin enfocar " + instruccion[1] + ". Intente ingresarAPdf " + instruccion[1] + " y pruebe de nuevo"; //Agrega el error a la lista err.Enlistar(new Error(err.GetLargo() + 1, instruccion[1], -1, instruccion[0].Length + 2, "Error de entorno. PDF sin enfocar")); } break; //4 case "escribirTexto": //Determina si el entorno es correcto, buscando el PDF enfocado actualmente if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) { //Informa al usuario del error y el sistema agrega a la lista el error TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. No ha ingresado a PDF, consulte el Manual de Usuario"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 1, "Error de Entorno. No hay PDF enfocado")); } else { //Determina si se subraya o no if (instruccion.Length < 4) { //Añade un texto subrayado texto.Encolar(new Texto(instruccion[1], instruccion[2][0], (char)48, this.indiceEdicion++)); } else { //Añade un texto sin subrayar texto.Encolar(new Texto(instruccion[1], instruccion[2][0], instruccion[3][0], this.indiceEdicion++)); } //Informa al usuario TxtArea.Text += Environment.NewLine + "Se escribió texto"; } break; //5 case "imagen": if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) { TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. No ha ingresado a PDF, consulte el Manual de Usuario"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 1, "Error de Entorno. No hay PDF enfocado")); } else { //Determina la existencia del archivo de imagen if (File.Exists(new Ruta().GetAbsolutePath(instruccion[1]))) { this.imagen.Encolar(new Imagen(new Ruta().GetAbsolutePath(instruccion[1]), instruccion[2], indiceEdicion++)); TxtArea.Text += Environment.NewLine + "Imagen agregada correctamente"; } else { TxtArea.Text += Environment.NewLine + "No se pudo encontrar la imagen en la ruta especificada."; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[1], -1, instruccion[0].Length + 2, "Archivo no Encontrado. Ruta inválida")); } } break; //6 case "crearTabla": if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) { //Informa al usuario que no hay ningun PDF enfocado y lista el error TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. No ha ingresado a PDF, consulte el Manual de Usuario"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 0, "Error de Entorno. No hay PDF enfocado.")); } else { //Añade la tabla a la cola e informa al usuario this.tabla.Encolar(new Tabla(instruccion[1], instruccion[2], indiceEdicion++)); TxtArea.Text += Environment.NewLine + "Tabla agregada correctamente"; } break; //7 case "crearFila": if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) { //Informa al usuario que no hay ningun PDF enfocado y enlista el error TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. No ha ingresado a PDF. Consulte el Manual de Usuario <mostrar> <ManualUsuario>"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 0, "Error de Entorno. No hay PDF enfocado.")); } else { //Agrega una nueva fila a la lista e informa al usuario this.fila.Enlistar(new Fila(instruccion[1], instruccion[2])); TxtArea.Text += Environment.NewLine + "Fila agregada a " + instruccion[2]; } break; //8 case "ejecutar": if (string.IsNullOrEmpty(focusedPDF) || focusedPDF.Equals("")) { //Verifica si hay más de una instrucción ejecutar, es decir si se encuentra un Ruta if (instruccion.Length > 1) { //Verifica que el archivo exista y que sea .If if (File.Exists(new Ruta().GetAbsolutePath(instruccion[1])) && (instruccion[1].Substring(instruccion[1].Length - 3, 3).Equals(".If") || instruccion[1].Substring(instruccion[1].Length - 3, 3).Equals(".if"))) { //Limpia el editor y agrega el texto obtenido del archivo this.TxtEditor.Text = new Ruta().GetTextFromFile(new Ruta().GetAbsolutePath(instruccion[1])); } else { //No se encuentra el archivo y se informa al usuario TxtArea.Text += Environment.NewLine + "El archivo no se encuentra en la ruta especificada o la extensión es incorrecta"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[1], -1, instruccion[0].Length + 2, "Archivo no Encontrado. Ruta inválida")); } } //lineaCodigo guarda todo lo que contiene el txt en un array , separados por filas String[] lineaCodigo = TxtEditor.Lines; //Obtiene el número de filas que tiene el array lineaCodigo int rowsCodigo = lineaCodigo.Length; //Instancia un Lenguaje de esta forma se mantiene las filas y columnas Lenguaje leng = new Lenguaje(); for (int i = 0; i < rowsCodigo; i++) { //Obtiene la cadena a Escanear String cadenaEscanear = lineaCodigo[i]; //Verifica que la cadena no esté vacía y evita crear un loop if (!string.IsNullOrEmpty(cadenaEscanear) && !cadenaEscanear.Equals("") && !cadenaEscanear.Contains("ejecutar")) { //Manda al analizador toda esta onda ListaSimple analizador = leng.AnalizarCadena(cadenaEscanear + (char)10); //Guarda la cadena Cola AEjecutar = GuardarTokens(analizador); //Determina si la cadena se ejecuta o no if (Escanear(analizador)) { //Ejecuta la cadena EjecutarToken(AEjecutar); } } } } else { //Informa a usuario que no hay ningun PDF enfocado y lo agrega a la lista TxtArea.Text += Environment.NewLine + "Instrucción fuera de entorno. Consulte el Manual de Usuario <mostrar> <ManualUsuario>"; err.Enlistar(new Error(err.GetLargo() + 1, instruccion[0], -1, 0, "Error de entorno. Hay un PDF enfocado")); } break; //9 case "mostrar": if (instruccion[1].Equals("ManualUsuario")) { new PDF().AbrirPDF(new Ruta().GetAbsolutePath("raiz/ManualUsuario.pdf")); } if (instruccion[1].Equals("ManualTecnico")) { new PDF().AbrirPDF(new Ruta().GetAbsolutePath("raiz/ManualTecnico.pdf")); } break; //10 case "reporteTokens": //Crea y despliega el pvto >:V HTML xdDXdX new Ruta().GenerarYAbrirFile(new Ruta().ReporteTokens(token, err), "ReporteTokens", ".html", true); break; //11 case "acercaDe": MessageBox.Show("201602782 - Sergio Fernando Otzoy Gonzalez", "Lenguajes Formales y de Programación"); break; default: TxtArea.Text += Environment.NewLine + "«" + instruccion[0] + "» no se reconoce como instruccion. Consulte los Manuales -> <mostrar> <ManualUsuario> ó <ManualTecnico>"; break; } TxtArea.Text += Environment.NewLine; }