#include <string.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <iostream.h> void error(char , int); class lectura_de_datos { public: char *linea; int linea_n; lectura_de_datos *sig; void muestra (void); // muestra los datos almacenados void lee_archivo (char *); // lee el archivo *.kar void inserta_nodo (char *); // inserta nodo a la lista }; class programa { public: char *comando; // comando a ejecutar programa *sig; // a que nodo apunta programa *hacia; // hacia donde va programa *de; // de donde viene void muestra(void); // muestra los datos almacenados programa *busca(char *); // busca comando en lista principal char *lee_parte_2(char *); // lee nombre de funcion de un string void crea_arbol(void); // genera el arbol con los comandos void ambiente(void); // genera rama de ambiente void ejecucion(void); // genera rama de ejecucion void funciones(void); // genera conjunto de funciones void lee_funciones(void); // genera el contenido de funciones programa *mientras(char *, programa *); // lee funciones MIENTRAS }; lectura_de_datos *dato_inicial; // apuntador al primer nodo programa *start; // apuntador a la raiz del programa char s[80],fnombre[80]; FILE *fp; void lectura_de_datos::lee_archivo(char *fnombre) // fnombre = nombre del ARCHIVO. { char ch, car[1], linea[80]; lectura_de_datos info; int contador = 1; if ((fp = fopen(fnombre,"rt")) == NULL) { printf("No se puede abrir el archivo"); return; } gotoxy(5,24); printf("Cargando el archivo %s\n",fnombre); ch = fgetc(fp); while (ch != EOF) { linea[0] = '\0'; while (ch == ' ' || ch == '\t' ) // quita espacios iniciales ch = fgetc(fp); while (ch != '\n') { car[0] = ch; car[1] = '\0'; strcat(linea, car); ch = fgetc(fp); } if (strlen(linea) > 0) { info.inserta_nodo (linea); contador++; } ch = fgetc(fp); } } void lectura_de_datos::inserta_nodo (char linea[80]) { lectura_de_datos info, *act = NULL, *ant = NULL, *nodo_nuevo = NULL; int contador = 1; if (!(nodo_nuevo = new lectura_de_datos)) { error('m',1); return; }; if (!dato_inicial) // es la primera linea { nodo_nuevo->linea = strdup(linea); nodo_nuevo->linea_n = contador; nodo_nuevo->sig = NULL; dato_inicial = nodo_nuevo; } else // ya existe por lo menos una linea { act = dato_inicial; while (act) // colocarse al final de la lista { ant = act; act = act->sig; contador++; } nodo_nuevo->linea = strdup(linea); nodo_nuevo->linea_n = contador; nodo_nuevo->sig = NULL; ant->sig = nodo_nuevo; } } void error(char letrero, int control) { gotoxy(30,18); switch (letrero) { case 'm': cout << "No hay memoria suficiente.." << "control= " << control; break; default: cout << "error desconocido"; } getch(); } void programa::crea_arbol(void) { programa prog; prog.ambiente(); prog.ejecucion(); dato_inicial = dato_inicial->sig; prog.funciones(); prog.lee_funciones(); } void programa::lee_funciones(void) { programa *p_ant = NULL, *p_nuevo = NULL, *raiz = NULL, prog; char cad_aux[11], num[3]; int repite = 0; while (dato_inicial) { if (strncmp(dato_inicial->linea, "DEFINE_NUEVA_INSTRUCCION", 24) == 0 ) { raiz = busca ( lee_parte_2 ( dato_inicial->linea ) ); // se coloca al inicio de la funcion p_ant = raiz; dato_inicial = dato_inicial->sig; // borra DEFINE_NUEVA_INSTRUCCION while (strncmp(dato_inicial->linea, "DEFINE_NUEVA_INSTRUCCION", 24) != 0 ) { if (strncmp(dato_inicial->linea, "INICIO", 6) == 0 ) { dato_inicial = dato_inicial->sig; continue; } if (strncmp(dato_inicial->linea, "FIN", 3) == 0 ) { dato_inicial = dato_inicial->sig; continue; } if (strncmp(dato_inicial->linea, "MIENTRAS", 8) == 0 ) { itoa(dato_inicial->linea_n, num, 10); strncpy(cad_aux, dato_inicial->linea, 8); cad_aux[8] = '\0'; strcat(cad_aux, num); if (!(p_nuevo = new programa)) { error('m',2); return; }; p_nuevo->comando = strdup( cad_aux ); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!raiz->hacia) { p_ant = p_nuevo; raiz->hacia = p_nuevo; // liga la funcion con su contenido } else { p_ant->sig = p_nuevo; p_ant = p_nuevo; } p_nuevo->hacia = prog.mientras( cad_aux, p_nuevo); continue; } if ( strncmp(dato_inicial->linea, "REPITE", 6) == 0 ) { repite = atoi(lee_parte_2 ( dato_inicial->linea )); // itoa(dato_inicial->linea_n, num, 10); PARA FUTURA AMPLIACION // cad_aux = strdup( dato_inicial->linea ); // strcat(cad_aux, num); CON MIENTRAS, SI, ... dato_inicial = dato_inicial->sig; while (repite > 0) { if (!(p_nuevo = new programa)) { error('m',3); return; }; p_nuevo->comando = strdup( dato_inicial->linea ); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!raiz->hacia) { p_ant = p_nuevo; raiz->hacia = p_nuevo; // liga la funcion con su contenido } else { p_ant->sig = p_nuevo; p_ant = p_nuevo; } // p_nuevo->hacia = prog.mientras(cad_aux, p_nuevo); PARA AMPLIACION repite--; } dato_inicial = dato_inicial->sig; continue; } if ( strncmp(dato_inicial->linea, "SI", 2) == 0 ) { dato_inicial = dato_inicial->sig; continue; } // ===================== Es una instruccion ================= if (!(p_nuevo = new programa)) { error('m',4); return; }; p_nuevo->comando = strdup( dato_inicial->linea ); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!raiz->hacia) { p_ant = p_nuevo; raiz->hacia = p_nuevo; // liga la funcion con su contenido } else { p_ant->sig = p_nuevo; p_ant = p_nuevo; } dato_inicial = dato_inicial->sig; } } //dato_inicial = dato_inicial->sig; } } programa *programa::mientras(char *mientras, programa *viene_de) { programa *p_nuevo = NULL, *pri_rama = NULL; programa *raiz = NULL, *p_act = start; // int contador_mientras = 0; FUTURA AMPLIACION while (p_act) { raiz = p_act; p_act = p_act->sig; } // hasta estar al final if (!(p_nuevo = new programa)) { error('m',5); return NULL; }; p_nuevo->comando = strdup( mientras ); // nombre de instruccion p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = viene_de; raiz->sig = p_nuevo; // enlaza con el siguiente raiz = p_nuevo; if (!(p_nuevo = new programa)) { error('m',6); return NULL; }; p_nuevo->comando = strdup( lee_parte_2( dato_inicial->linea ) ); // condicion p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; raiz->hacia = p_nuevo; // enlaza con su contenido pri_rama = p_nuevo; // inicio de la rama dato_inicial = dato_inicial->sig; // cuerpo del mientras while ( strncmp(dato_inicial->linea, "FIN", 3) != 0 && strncmp(dato_inicial->linea, "DEFINE", 6) != 0 ) { if (!(p_nuevo = new programa)) { error('m',7); return NULL; }; p_nuevo->comando = strdup( dato_inicial->linea ); // comando p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!pri_rama->sig) { p_act = p_nuevo; pri_rama->sig = p_nuevo; } else { p_act->sig = p_nuevo; p_act = p_nuevo; } dato_inicial = dato_inicial->sig; } p_act->sig = pri_rama; // reinicia a la condicion return raiz; } programa *programa::busca(char *cadena) { programa *p_act = start; while (p_act) { if ( strncmp( cadena, p_act->comando, strlen(cadena) ) == 0) return p_act; p_act = p_act->sig; } return NULL; } // <====================> // <=========== LECTURA DE FUNCIONES =================> // <====================> void programa::funciones(void) { programa *p_nuevo = NULL, *raiz_rama = start, *raiz = NULL; lectura_de_datos *d_act = dato_inicial; while (raiz_rama) // colocarse al final de la lista { raiz = raiz_rama; raiz_rama = raiz_rama->sig; } while (d_act) { if (strncmp(d_act->linea, "DEFINE_NUEVA_INSTRUCCION", 24) == 0 ) { if (!(p_nuevo = new programa)) { error('m',8); return; }; p_nuevo->comando = strdup(lee_parte_2(d_act->linea)); // nombre de instruccion p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; raiz->sig = p_nuevo; // enlaza con lista de funciones raiz = p_nuevo; // recorre al nuevo nodo } d_act = d_act->sig; } } // <====================> // <=========== LECTURA DE EJECUCION =================> // <====================> void programa::ejecucion(void) { programa prog, *pri_rama = NULL, *p_ant = NULL; programa *p_nuevo, *raiz_rama = start; lectura_de_datos *d_ant = NULL, *d_act = dato_inicial; if (!(p_nuevo = new programa)) // reserva memoria { error('m',9); return; }; while (strncmp(d_act->linea, "INICIO_DE_EJECUCION",19) !=0 ) { d_ant = d_act; d_act = d_act->sig; } p_nuevo->comando = strdup(d_act->linea); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; raiz_rama->sig = p_nuevo; raiz_rama = p_nuevo; d_ant->sig = d_act->sig; // elimina nodo d_act = d_act->sig; p_ant = NULL; pri_rama = NULL; while (strncmp(d_act->linea, "FIN_DE_EJECUCION",16) !=0 ) { if (!(p_nuevo = new programa)) // reserva memoria { error('m',10); return; }; p_nuevo->comando = strdup(d_act->linea); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!pri_rama) pri_rama = p_nuevo; else p_ant->sig = p_nuevo; p_ant = p_nuevo; d_ant->sig = d_act->sig; // elimina nodo d_act = d_act->sig; } raiz_rama->hacia = pri_rama; // enlaza con la segunda rama d_ant->sig = d_act->sig; // elimina nodo } // <====================> // <=========== LECTURA DEL AMBIENTE =================> // <====================> void programa::ambiente(void) { programa prog, *pri_rama = NULL, *p_ant = NULL, *p_nuevo, *raiz_rama; if (!(p_nuevo = new programa)) // reserva memoria { error('m',11); return; }; start = p_nuevo; // inicio de arbol raiz_rama = p_nuevo; // busca el inicio while (strncmp(dato_inicial->linea, "INICIO_DE_AMBIENTE", 18) != 0 ) dato_inicial = dato_inicial->sig; p_nuevo->comando = strdup(dato_inicial->linea); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; dato_inicial = dato_inicial->sig; while (strncmp(dato_inicial->linea, "FIN_DE_AMBIENTE", 15) !=0 ) { if (!(p_nuevo = new programa)) // reserva memoria { error('m',12); return; }; p_nuevo->comando = strdup(dato_inicial->linea); p_nuevo->sig = NULL; p_nuevo->hacia = NULL; p_nuevo->de = NULL; if (!pri_rama) pri_rama = p_nuevo; else p_ant->sig = p_nuevo; p_ant = p_nuevo; dato_inicial = dato_inicial->sig; } raiz_rama->hacia = pri_rama; // enlaza con la primera rama dato_inicial = dato_inicial->sig; // desecha el AMBIENTE } char *programa::lee_parte_2(char *cadena) { char ch = cadena[0], car[1], *ret = '\0'; while (ch != ' ') { cadena++; ch = cadena[0]; } // busca espacio cadena = cadena++; // quita espacio ch = cadena[0]; ret[0] = '\0'; while (ch != ' ') // busca espacio { car[0] = ch; car[1] = '\0'; strcat(ret, car); cadena++; ch = cadena[0]; } return ret; } void main(void) { char *archivo; lectura_de_datos info; programa prog; dato_inicial = NULL; clrscr(); printf("Nombre de archivo: "); gets(archivo); info.lee_archivo (archivo); // <======= ok prog.crea_arbol(); //info.muestra(); // <======= ok prog.muestra(); getch(); clrscr(); } void programa::muestra (void) { programa *raiz = start, *act = NULL; while (raiz) { act = raiz->hacia; cout << "COMANDO==> " << raiz->comando << "\n"; while (act) { cout << act->comando << "\n"; act = act->sig; } getch(); raiz = raiz->sig; } } /* void lectura_de_datos::muestra (void) { lectura_de_datos *act = dato_inicial; while (act) { cout << act->linea << "<==>(" << act->linea_n << ")\n"; getch(); act = act->sig; } } */