/////////////////////////////////////////////////////////////////////////////////////////// #region Metodo_SetInfo public void SetInfo(Nimbus_DAL objTmp) { try { dataGridView1.Rows.Add(objTmp.CODIGO, objTmp.SIMBOLO, objTmp.TIPO_TOKEN, objTmp.AMBITO); } catch (Exception) { MessageBox.Show("Error en Token"); } }
public Nimbus_DAL FOLLOWING() { if (objTmp.SIGUIENTE == null) { return(objTmp); } else { objTmp = objTmp.SIGUIENTE; return(objTmp); } }
public Nimbus_DAL PREVIOUS() { if (objTmp.ANTERIOR == null) { return(objTmp); } else { objTmp = objTmp.ANTERIOR; return(objTmp); } }
public void SetInfoError(Nimbus_DAL objTmp, string Error, int lineapalabra) { try { string error = "Error Lexico - Id del Token: " + objTmp.CODIGO + "- Token: " + objTmp.SIMBOLO + "- Ambito: " + objTmp.AMBITO + "- Error: " + Error + "- Posición: " + lineapalabra; dataGridView2.Rows.Add(error); } catch (Exception) { MessageBox.Show("Error en Token"); } }
public void MODIFICAR(Nimbus_DAL TOKEN) { objTmp = objInitial; do { if (objTmp.SIMBOLO.Equals(TOKEN.SIMBOLO)) { objTmp.AMBITO = TOKEN.AMBITO; break; } objTmp = objTmp.SIGUIENTE; } while (objTmp != objInitial); }
public Nimbus_DAL FILL(string Codigo, string Simbolo, string Tipo_Token, int Ambito, Nimbus_DAL Anterior, Nimbus_DAL Siguiente) { Nimbus_DAL dTemp = new Nimbus_DAL(); dTemp.CODIGO = Codigo; dTemp.SIMBOLO = Simbolo; dTemp.TIPO_TOKEN = Tipo_Token; dTemp.AMBITO = Ambito; dTemp.ANTERIOR = Anterior; dTemp.SIGUIENTE = Siguiente; return(dTemp); }
public void SAVE(string Codigo, string Simbolo, string Tipo_Token, int Ambito) { if (objInitial == null) { objInitial = FILL(Codigo, Simbolo, Tipo_Token, Ambito, null, null); objQueue = objInitial; objTmp = objInitial; } else { objQueue.SIGUIENTE = FILL(Codigo, Simbolo, Tipo_Token, Ambito, objQueue, objInitial); objQueue = objQueue.SIGUIENTE; objInitial.ANTERIOR = objQueue; } }
public Nimbus_DAL SEARCH_TOKEN(Nimbus_DAL TOKEN) { objTmp = objInitial; Nimbus_DAL dTemp = new Nimbus_DAL(); do { if (objTmp.SIMBOLO.Equals(TOKEN.SIMBOLO)) { dTemp = objTmp; } objTmp = objTmp.SIGUIENTE; } while (objTmp != objInitial); return(dTemp); }
public void DELETE_LIST() { objInitial = null; objQueue = null; objTmp = null; //if (objInitial == objQueue && ext.SIMBOLO.Equals(objInitial.SIMBOLO)) //{ // objInitial = null; // objQueue = null; //} //else if (ext.SIMBOLO.Equals(objInitial.SIMBOLO)) //{ // Nimbus_DAL tmpanterior = new Nimbus_DAL(); // tmpanterior = objTmp.ANTERIOR; // objTmp = objTmp.SIGUIENTE; // objInitial = objTmp; // objTmp.ANTERIOR = tmpanterior; // tmpanterior.SIGUIENTE = objTmp; //} //else if (ext.SIMBOLO.Equals(objQueue.SIMBOLO)) //{ // Nimbus_DAL tmpanterior = new Nimbus_DAL(); // tmpanterior = objQueue.ANTERIOR; // objTmp = objQueue.SIGUIENTE; // objQueue = tmpanterior; // objTmp.ANTERIOR = tmpanterior; // tmpanterior.SIGUIENTE = objTmp; //} //else //{ // Nimbus_DAL tmpanterior = new Nimbus_DAL(); // objTmp = objInitial; // while (objTmp.SIGUIENTE != objQueue) // { // if (ext.Equals(objTmp)) // { // tmpanterior = objTmp.ANTERIOR; // objTmp = objTmp.SIGUIENTE; // objTmp.ANTERIOR = tmpanterior; // tmpanterior.SIGUIENTE = objTmp; // } // else // { // objTmp = objTmp.SIGUIENTE; // } // } //} }
public void LoadData() { contador = 1; Nimbus_DAL objTmp = new Nimbus_DAL(); try { //OpenFileDialog ofd = new OpenFileDialog(); //ofd.Title = "csv"; //ofd.ShowDialog(); //if (File.Exists(ofd.FileName)) //{ // string[] Lines = File.ReadAllLines(ofd.FileName); // foreach (var line in Lines) // { // var values = line.Split(','); // objTmp.CODIGO = values[0]; // objTmp.SIMBOLO = values[1]; // objTmp.TIPO_TOKEN = values[2]; // obj_Bll.SAVE(objTmp.CODIGO, objTmp.SIMBOLO, objTmp.TIPO_TOKEN); // contador++; // } //} //ofd.Dispose(); //MessageBox.Show("Lenguaje cargado."); ///////////////////////////////////////////////////////////////////////////////////////// string[] Lines = File.ReadAllLines("C:\\Users\\dmx369zhw\\Documents\\GitHub\\Modelo_Programacion_Sistemas\\Tabla_Simbolos\\Tabla_Simbolos.csv"); foreach (var line in Lines) { var values = line.Split(','); objTmp.CODIGO = values[0]; objTmp.SIMBOLO = values[1]; objTmp.TIPO_TOKEN = values[2]; objTmp.AMBITO = Convert.ToInt32(values[3]); obj_Bll.SAVE(objTmp.CODIGO, objTmp.SIMBOLO, objTmp.TIPO_TOKEN, objTmp.AMBITO); contador = contador + 1; } } catch (Exception) { MessageBox.Show("Error en carga el Lenguaje"); LoadData(); } }
/////////////////////////////////////////////////////////////////////////////////////////// #region Cogigo_Intermedio public void Codigo_intermedio() { //LoadData(); try { Semantica_DAL objSemantica_dal = new Semantica_DAL(); Semantica_DAL objSeamntica2_dal = new Semantica_DAL(); Nimbus_DAL obj_Dal = new Nimbus_DAL(); Nimbus_DAL obj_temp = new Nimbus_DAL(); char[] delimitador1 = { '\udddd', '\xA' }; char[] delimitador = { ' ', '\n' }; // \udddd \xA string Frase = Panel_Codigo.Text; string[] Palabras = Frase.Split(delimitador1); string mensaje = "dd", cabecera = "jj", pie = "df", fin = "tg"; Boolean b_Suma = false, b_Resta = false, b_Multi = false, b_Div = false; if (!Directory.Exists(@"C:\Nimbus\Cod_Intermedio")) { Directory.CreateDirectory(@"C:\Nimbus\Cod_Intermedio"); } StreamWriter Cod_Intermedio = File.AppendText(@"C:\Nimbus\Cod_Intermedio\Cod_Intermedio.asm"); #region Cabecera cabecera = "include \'emu8086.inc\'\r\n" + "org 100h \r\n" + ".data \r\n\n" + "define_print_string \r\n" + "define_print_num \r\n" + "define_print_num_uns \r\n" + "sum db 3 dup (?) \r\n" + "rest db 3 dup (?) \r\n" + "mult db 3 dup (?) \r\n" + "divi db 3 dup (?) \r\n\n" + ".code \r\n"; Cod_Intermedio.WriteLine(cabecera); #endregion foreach (var palabra in Palabras) { //MessageBox.Show(palabra); string[] valores = palabra.Trim().Split(' '); if (PatronSemantico.Validad_Variables(palabra)) { #region Seccion_Suma if (palabra.Contains("sum")) { b_Suma = true; int i = 0; foreach (var valor in valores) { objSemantica_dal.NOMBRE = valor.Trim(); objSeamntica2_dal = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal); if (!(objSeamntica2_dal.NOMBRE == null)) { mensaje = "mov sum[" + i + "]," + objSeamntica2_dal.VALOR; i++; //MessageBox.Show(mensaje); Cod_Intermedio.WriteLine(mensaje); } } } #endregion #region Seccion_Resta if (palabra.Contains("res")) { b_Resta = true; int i = 0; foreach (var valor in valores) { objSemantica_dal.NOMBRE = valor.Trim(); objSeamntica2_dal = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal); if (!(objSeamntica2_dal.NOMBRE == null)) { mensaje = "mov rest[" + i + "]," + objSeamntica2_dal.VALOR; i++; //MessageBox.Show(mensaje); Cod_Intermedio.WriteLine(mensaje); } } } #endregion #region Seccion_Multiplicacion if (palabra.Contains("mult")) { b_Multi = true; int i = 0; foreach (var valor in valores) { objSemantica_dal.NOMBRE = valor.Trim(); objSeamntica2_dal = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal); if (!(objSeamntica2_dal.NOMBRE == null)) { mensaje = "mov mult[" + i + "]," + objSeamntica2_dal.VALOR; i++; //MessageBox.Show(mensaje); Cod_Intermedio.WriteLine(mensaje); } } } #endregion #region Seccion_Division if (palabra.Contains("div")) { b_Div = true; int i = 0; foreach (var valor in valores) { objSemantica_dal.NOMBRE = valor.Trim(); objSeamntica2_dal = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal); if (!(objSeamntica2_dal.NOMBRE == null)) { mensaje = "mov divi[" + i + "]," + objSeamntica2_dal.VALOR; i++; //MessageBox.Show(mensaje); Cod_Intermedio.WriteLine(mensaje); } } } #endregion } } #region Pie if (b_Suma) { pie = "\r\nSumas proc\r\n" + "printn \" \"\r\n" + "xor ax,ax \r\n" + "add al, sum[1] \r\n" + "add al, sum[2] \r\n" + "mov sum[0],al \r\n" + "print \"La suma es: \" \r\n" + "call print_num \r\n" + "Sumas endp \r\n"; Cod_Intermedio.WriteLine(pie); } if (b_Resta) { pie = "\r\nRestas proc\r\n" + "printn \" \"\r\n" + "xor ax,ax \r\n" + "add al, rest[1] \r\n" + "sub al, rest[2] \r\n" + "mov rest[0],al \r\n" + "print \"La resta es: \" \r\n" + "call print_num \r\n" + "Restas endp \r\n"; Cod_Intermedio.WriteLine(pie); } if (b_Multi) { pie = "\r\nMultiplicaciones proc\r\n" + "printn \" \"\r\n" + "xor ax,ax \r\n" + "add al, mult[1] \r\n" + "mul mult[2] \r\n" + "mov mult[0],al \r\n" + "print \"La multiplicacion es: \" \r\n" + "call print_num \r\n" + "Multiplicaciones endp \r\n"; Cod_Intermedio.WriteLine(pie); } if (b_Div) { pie = "\r\nDivisiones proc\r\n" + "printn \" \"\r\n" + "xor ax,ax \r\n" + "add al, divi[1] \r\n" + "div divi[2] \r\n" + "mov divi[0],al \r\n" + "print \"La division es: \" \r\n" + "call print_num \r\n" + "Divisiones endp \r\n"; Cod_Intermedio.WriteLine(pie); } #endregion #region Fin fin = "\r\nexit:\r\n" + "mov ah,0 \r\n" + "int 16h \r\n\n" + "ret \r\n" + "end \r\n"; Cod_Intermedio.WriteLine(fin); #endregion Cod_Intermedio.Close(); } catch (Exception ex) { MessageBox.Show("Error en: " + ex); } }
public void Analizar_Valores() { //LoadData(); Semantica_DAL objSemantica_dal = new Semantica_DAL(); Semantica_DAL objSeamntica2_dal = new Semantica_DAL(); Nimbus_DAL obj_Dal = new Nimbus_DAL(); Nimbus_DAL obj_temp = new Nimbus_DAL(); char[] delimitador1 = { '\udddd', '\xA' }; char[] delimitador = { ' ', '\n' }; // \udddd \xA string Frase = Panel_Codigo.Text; string[] Palabras = Frase.Split(delimitador1); string auxsema = "dd"; string auxnimbus = "dd"; bool compatibleN = false; bool compatibleC = false; foreach (var palabra in Palabras) { //MessageBox.Show(palabra); string[] valores = palabra.Trim().Split(' '); if (PatronSemantico.Validad_Variables(palabra)) { foreach (var valor in valores) { //MessageBox.Show(valor); obj_Dal.SIMBOLO = valor.Trim(); auxnimbus = valor.Trim(); obj_temp = obj_Bll.SEARCH_TOKEN(obj_Dal); auxnimbus = obj_temp.SIMBOLO; if (!(obj_temp.TIPO_TOKEN.Equals("Signo_de_Puntuacion") || obj_temp.TIPO_TOKEN.Equals("Constante") || obj_temp.TIPO_TOKEN.Equals("Concatenacion") || obj_temp.TIPO_TOKEN.Equals("Asignacion") || obj_temp.TIPO_TOKEN.Equals("Encapsulamiento") || obj_temp.TIPO_TOKEN.Equals("Palabra_Reservada") || obj_temp.TIPO_TOKEN.Equals("Funcion_Imprimir") || obj_temp.TIPO_TOKEN.Equals("Funcion_Capturar") || obj_temp.TIPO_TOKEN.Equals("Operador_Matematico") || obj_temp.TIPO_TOKEN.Equals("Expresion_Booleana") || obj_temp.TIPO_TOKEN.Equals("Operador_Logico") || obj_temp.TIPO_TOKEN.Equals("Condicional") || obj_temp.TIPO_TOKEN.Equals("Ciclo") || obj_temp.TIPO_TOKEN.Equals("Declarador_de_Funcion") || obj_temp.TIPO_TOKEN.Equals("Retorno_Funcion") || obj_temp.TIPO_TOKEN.Equals("Declarador_de_Procedimiento") || obj_temp.TIPO_TOKEN.Equals("Delimitador_de_Sentencia") || obj_temp.TIPO_TOKEN.Equals("Digito_Entero") || obj_temp.TIPO_TOKEN.Equals("Digito_Flotante") || obj_temp.TIPO_TOKEN.Equals("Caracter"))) { objSemantica_dal.NOMBRE = obj_temp.SIMBOLO; objSeamntica2_dal = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal); auxsema = objSeamntica2_dal.NOMBRE; if (auxsema != auxnimbus) { //MessageBox.Show("Variable " + auxnimbus + " no definida"); string error = "Error Semantico - Definición: " + auxnimbus + " - Error variable no definida - Posición: " + (lineapalabra - 1); dataGridView2.Rows.Add(error); } else { List <Semantica_DAL> lista = new List <Semantica_DAL>(); Semantica_DAL objSemantica_dal_temp = new Semantica_DAL(); objSemantica_dal_temp.NOMBRE = auxsema; objSemantica_dal_temp = obj_Sema_bll.SEARCH_NOMBRE(objSemantica_dal_temp); lista.Add(objSemantica_dal_temp); foreach (var objeto in lista) { if (objeto.TIPO.Equals("flo") || objeto.TIPO.Equals("en")) { compatibleN = true; } if (objeto.TIPO.Equals("ca")) { compatibleC = true; } } } if (compatibleN == true && compatibleC == true) { string error = "Error Semantico - Error de tipos en variables - Posición: " + (lineapalabra - 1); dataGridView2.Rows.Add(error); } } } } } }
/////////////////////////////////////////////////////////////////////////////////////////// #region Analisis_Lexico public void Lexico() { Ambito = 0; llave = 0; llaveC = 0; LoadData(); Nimbus_DAL obj_Dal = new Nimbus_DAL(); Nimbus_DAL obj_temp = new Nimbus_DAL(); string Simbol = "hh", Token = "jj"; char[] delimitador = { ' ', '\n' }; // \udddd \xA char[] delimitador2 = { '\udddd', '\xA' }; string Frase = Panel_Codigo.Text; string[] Oraciones = Frase.Split(delimitador2); foreach (var oracion in Oraciones) { #region error_Line try { int linha, palavra; linha = Panel_Codigo.Find(oracion); palavra = Panel_Codigo.GetLineFromCharIndex(linha); lineapalabra = palavra + 1; } catch (Exception) { string error = "EL DOCUMENTO NO DEBE TENER SALTOS EN BLANCO"; SetInfoError(obj_Bll.SEARCH_TOKEN(obj_Dal), error, lineapalabra); } #endregion string ora = oracion; //MessageBox.Show(ora); string[] Palabras = ora.Split(delimitador); foreach (var palabra in Palabras) { obj_Dal.SIMBOLO = palabra.Trim(); Token = palabra.Trim(); obj_temp = obj_Bll.SEARCH_TOKEN(obj_Dal); Simbol = obj_temp.SIMBOLO; #region Control de Ambito Apertura if (Token.Equals("[")) { llave = llave + 1; Ambito = llave; //Ambito = Ambito + 1; } #endregion if (Simbol == string.Empty || Simbol == null) { if (Token != string.Empty || Token != null) { bool vacio = true; char[] letras = Token.ToCharArray(); foreach (var letra in letras) { if (!letra.Equals(" ")) { if (char.IsNumber(letra)) { if (ValidaEntero(Token)) { obj_Dal.TIPO_TOKEN = "Digito_Entero"; } else { obj_Dal.TIPO_TOKEN = "Digito_Flotante"; } } else if (char.IsPunctuation(letra)) { obj_Dal.TIPO_TOKEN = "Caracter"; } else { obj_Dal.TIPO_TOKEN = "Definicion_del_Usuario"; } vacio = false; } } if (vacio == false) { obj_Dal.CODIGO = Convert.ToString(contador); obj_Dal.SIMBOLO = Token; obj_Dal.AMBITO = Ambito; obj_Bll.SAVE(obj_Dal.CODIGO, obj_Dal.SIMBOLO, obj_Dal.TIPO_TOKEN, obj_Dal.AMBITO); SetInfo(obj_Bll.SEARCH_TOKEN(obj_Dal)); contador = contador + 1; } } } else { if (obj_temp.TIPO_TOKEN.Equals("Inicio_de_Programa") || obj_temp.TIPO_TOKEN.Equals("Funcion_Principal") || obj_temp.TIPO_TOKEN.Equals("Apertura_Ambito") || obj_temp.TIPO_TOKEN.Equals("Cierre_Ambito") || obj_temp.TIPO_TOKEN.Equals("Signo_de_Puntuacion") || obj_temp.TIPO_TOKEN.Equals("Constante") || obj_temp.TIPO_TOKEN.Equals("Concatenacion") || obj_temp.TIPO_TOKEN.Equals("Asignacion") || obj_temp.TIPO_TOKEN.Equals("Encapsulamiento") || obj_temp.TIPO_TOKEN.Equals("Palabra_Reservada") || obj_temp.TIPO_TOKEN.Equals("Funcion_Imprimir") || obj_temp.TIPO_TOKEN.Equals("Funcion_Capturar") || obj_temp.TIPO_TOKEN.Equals("Operador_Matematico") || obj_temp.TIPO_TOKEN.Equals("Expresion_Booleana") || obj_temp.TIPO_TOKEN.Equals("Operador_Logico") || obj_temp.TIPO_TOKEN.Equals("Condicional") || obj_temp.TIPO_TOKEN.Equals("Ciclo") || obj_temp.TIPO_TOKEN.Equals("Declarador_de_Funcion") || obj_temp.TIPO_TOKEN.Equals("Retorno_Funcion") || obj_temp.TIPO_TOKEN.Equals("Declarador_de_Procedimiento") || obj_temp.TIPO_TOKEN.Equals("Delimitador_de_Sentencia") || obj_temp.TIPO_TOKEN.Equals("Digito_Entero") || obj_temp.TIPO_TOKEN.Equals("Digito_Flotante") || obj_temp.TIPO_TOKEN.Equals("Caracter")) { obj_temp.AMBITO = Ambito; obj_Bll.MODIFICAR(obj_temp); SetInfo(obj_Bll.SEARCH_TOKEN(obj_Dal)); } else { if (obj_temp.AMBITO == Ambito) { string error = "Variable ya fue declarada"; SetInfoError(obj_Bll.SEARCH_TOKEN(obj_Dal), error, lineapalabra); } else { obj_temp.AMBITO = Ambito; obj_Bll.MODIFICAR(obj_temp); SetInfo(obj_Bll.SEARCH_TOKEN(obj_Dal)); } } } #region Control de Ambito Cierre if (Token.Equals("]")) { llaveC = llaveC + 1; Ambito = Ambito - llaveC; if (Ambito < 0) { Ambito = 1; } //Ambito = Ambito - 1; } #endregion } } if (llaveC != llave) { string error = "- Fata cierre o apertura de Ambito -"; SetInfoError(obj_Bll.SEARCH_TOKEN(obj_Dal), error, lineapalabra); } //obj_Bll.DELETE_LIST(); }