Академический Документы
Профессиональный Документы
Культура Документы
Tarea #4
Diseo del Analizador Lexicogrfico.
Procesador: 2xIntel (R) Core(TM)2 Duo CPU T6600 @ 2.20 Ghz. Memoria RAM : 3 Gb Sistema Operativo: Ubuntu 10.04.2 LTS Kernel : Linux 2.6.32-32-generic (i686) Compilador: GNU C Compiler Version 4.4.3 (Ubuntu 4.4.3-4 Ubuntu5)
Gramtica Tipo 3 del Analizador Lexicogrfico Galex = {V,T,P,S} alex = {Todos los smbolos del teclado} V= {<uami>, <Funciones_Archivo>, <Init.c> , <Carga_Buffer> <Funciones_Smbolos>,
,
<Carga_Buffer1>,<Carga_Buffer2>,<ALEX>, <delimitadores>, <variables>,<nmeros>,<operadores>,<cadena>,<EOF>, <blanco>, <salto_linea> , <tab> , <llave>, <letra>, <smbolos_desconocidos>, <vaco>, <letra>, <num>,<guin_bajo>, <comilla>, <fin_comilla>}
T = {Todos los conjuntos de palabras, nmeros y/o caracteres que sean reconocidos por ALEX} P = <uami> S
<uami.c>
<uami>
<Funciones_Archivo>
(Valida_Archivo)(Cambia_Nombre)(Cambia_Nombre2)(Crea_Copia)
<Init.c>
Inicia_Tabla
<Carga_Buffer> (<Carga_Buffer1><Carga_Buffer2>*(<ALEX>+(<Carga_Buffer1>*<ALEX>*<Carga_Buffer2>*))+
<Carga_Buffer1>
Carga_Buffer1
<Carga_Buffer2>
Carga_Buffer2
<ALEX>
(<delimitadores>|<variables>|<nmeros>|<operadores>|<cadena>)*|<EOF>
<variables>
<letra>(<letra>|<num>|<guin_bajo>)*
<nmeros>
<num><num>*
<operadores>
<EOF>
\0
<blanco>
\b
<salto_linea>
\n
<tab>
\t
<llave>
<letra>
{a, b, c, z, A, B, C, .., Z}
<nmeros>
{0, 1, 2, 3, 5, 6, 7, 8, 9}
<vaco>
<comilla>
<fin_comilla>
<guin_bajo>
<Simbolos_desconocidos -> {Todos aquellos que no pudieron ser reconocidos por ALEX}
Cdigo Fuente del Programa. global.h #include<stdio.h> #include<ctype.h> #include<stdlib.h> #include<string.h> #define NINGUNO -1 #define EOS '\0' #define ERROR 0 #define CORRECTO 1 #define MAX_PALABRA 999 #define MAX_SIMBOLOS 100 #define Tam_Buffer 50 /*Tamao del buffer*/
/*Definicin de las funciones en tabla_simbolos.c*/ int busca (char *s); char *almacena (char *s); int inserta (char *s, int tok); void put_token (int i , int new_token); int get_token (int i); char *get_system (int i); void imprime_simbolos (); void inicializa_tabla(); /*Definida en init.c*/ void funciones_archivo(char *s); int valida_archivo (char *s);
/*Definicin de la Estructura*/ struct entry { char *lexptr; /*Valor*/ int token; /*tipo*/ };
#define ENTONCES #define OTRO #define MIENTRAS #define HAZ #define IMPRIME #define DUMP #define HALT #define REPITE #define HASTA #define PARA #define A #define LEE #define DIV #define MOD #define ESCRIBE 268 266
265
267
/*Fichas de tipos*/
300
#define GE #define GT #define SUMA #define RESTA #define NE #define MULT #define OR #define AND #define MUL_OP #define ADD_OP
304 305 306 307 308 309 310 311 312 313
uami.c #include "global.h" int main (int argc, char* argv[]) { char *nom_fte; if (argc<2) printf("Error. Ingrese archivo fuente.\n"); else { if(valida_archivo(argv[1])== ERROR) printf("Error. Archivo fuente no vlido\n"); else { if ((archivo = fopen(argv[1], "rb"))==NULL) printf ("Error al abrir el archivo\n"); else { cambia_nombre(argv[1]); cambia_nombre2(argv[1]); crea_copia(argv[1]); archivo_tuplas = fopen(nombre1, "w");
inicializa_tabla();
do{ carga_buffer();
}while ( feof(archivo) == 0); } } fclose(archivo_tuplas); fclose(archivo); if(x==259) { printf("Numero de lneas: %d\n", num_linea); imprime_simbolos(); return 0; } } }
funciones_archivo.c
#include "global.h"
void cambia_nombre2(char *s) { int tam, i; tam = strlen(s)-4; for(i=0; i<tam; i++) nombre2[i] = *s++; strcat(nombre2, ".err"); }
fclose(archivo_original); fclose(archivo_copia); }
int valida_archivo (char *s) { int tam_cadena; tam_cadena = strlen(s)-4; if (s[tam_cadena] == '.' && s[tam_cadena+1] == 'f' && s[tam_cadena+2] == 't' && s[tam_cadena+3] == 'e') return CORRECTO;
return ERROR; }
init.c
"programa",
PROGRAMA,
"si", "entonces", "otro", "haz", "mientras", "comienza", "termina", "escribe", "imprime", "lee", "halt", "dump", "div", "mod", "repite", "hasta", "para", "a", "", 0, };
SI, ENTONCES, OTRO, HAZ, MIENTRAS, COMIENZA, TERMINA, ESCRIBE, IMPRIME, LEE, HALT, DUMP, DIV, MOD, REPITE, HASTA, PARA, A, CADENA, 0
void inicializa_tabla(){
inserta(p->lexptr , p->token); }
if(isspace(buffer[*n]) || buffer[*n]=='{') { while(isspace(buffer[*n]) || buffer[*n]=='{') { if (buffer[*n]=='\n') { num_linea++; aux = 0; } if (buffer[*n]== '{') { /*Tira espacios en blanco*/
p = *n - 1; if(*n == Tam_Buffer && k == 1 && buffer[p] != '\n') { aux = -1; do{ aux++;
}while(buffer2[aux] != '\n' && aux<Tam_Buffer); } p = *n - 1; if(*n == Tam_Buffer && k == 2 && buffer[p] != '\n') { aux =-1; do{ aux++; }while(buffer1[aux] != '\n' && aux<Tam_Buffer); aux = aux+1; }
num_linea++; } *n = *n+1;
} p = 0; }
if (buffer[*n]== EOF) { tokenval = HECHO; return HECHO; /*Si se ha terminado de leer el archivo*/ }
} }
if(k==2 && *n == Tam_Buffer ) { aux = 0; if (isdigit(buffer1[aux])) { while(isdigit(buffer1[aux]) && aux<Tam_Buffer) { aux++; } } } return NUM_ENT; }
if(isalpha(buffer[*n])) /*buffer[n] es una letra*/ { p = b = 0; while((isalnum(buffer[*n]) || buffer[*n] == '_')&& *n<Tam_Buffer) /*buffer[n] es alfanumrico*/ { buffer_lex[b] = buffer[*n]; /*Inserta en el buffer el caracter, concatenando la palabra*/ *n = *n+1;
while((isalnum(buffer2[aux]) || buffer2[aux] == '_')&& aux <Tam_Buffer) /*buffer[n] es alfanumrico*/ { buffer_lex[b] = buffer2[aux]; /*Inserta en el buffer el caracter, concatenando la palabra*/ aux++; b = b+1; if(b>=Tam_Buffer) error("Error al Compilar"); } }
while((isalnum(buffer1[aux]) || buffer1[aux] == '_')&& aux <Tam_Buffer) /*buffer[n] es alfanumrico*/ { buffer_lex[b] = buffer1[aux]; /*Inserta en el buffer el caracter,
buffer_lex[b]= EOS; /*Marca fin de palabra*/ p = busca (buffer_lex); /*Verifica si la palabra no se encuentra en la tabla de smbolos*/ if (p == 0) /*Si p no es una palabra reservada*/ p = inserta(buffer_lex, ID); tokenval = p; n--; n++; return get_token(p); }
if(buffer[*n] == '<' || buffer[*n]== '!' || buffer[*n] == '>' || buffer[*n] == '=' || buffer[*n] == '|' || buffer[*n] == '&' || buffer[*n] == '+' || buffer[*n] == '-' || buffer[*n] == '*' || buffer[*n] == '/' || buffer[*n] == '%') { int c = *n; *n=*n+2; return op_arit(buffer, c, &n);
while(buffer[*n] != '"' && *n<Tam_Buffer) { buffer_comentario[b] = buffer[*n]; *n=*n+1; b=b+1; } buffer_comentario[b] = buffer[*n];
h = *n-1; if(*n == Tam_Buffer && k == 1 && buffer[h] != '"') { aux = 0; while(buffer2[aux] != '"' && aux<Tam_Buffer) { buffer_comentario[b] = buffer2[aux]; aux++; b++; } buffer_comentario[b] = buffer2[aux];
} h = *n-1; if(*n == Tam_Buffer && k == 2 && buffer[h] != '"') { aux = 0; while(buffer1[aux] != '"' && aux<Tam_Buffer) { buffer_comentario[b] = buffer1[aux]; aux++; b++; } buffer_comentario[b] = buffer1[aux]; } buffer_comentario[b+1]= EOS; tokenval = inserta(buffer_comentario, CADENA); *n = *n+1; p=b=0; return CADENA; }
int edo;
if ( buffer[c] == '<') edo = 0; else if (buffer[c] == '!') edo = 1; else if (buffer[c] == '>') edo = 2; else if (buffer[c] == '=') edo = 3; else if (buffer[c] == '|') edo =4; else if (buffer[c] == '&') edo =5; else if (buffer[c] == '+'){ tokenval = SUMA; *n = *n-1; return ADD_OP;} else if (buffer[c] == '-'){ tokenval = RESTA; *n = *n-1; return MUL_OP;} else if (buffer[c] == '/'){ tokenval = DIV; *n=*n-1; return MUL_OP;} else if ( buffer[c] == '%'){ tokenval = MOD; *n=*n-1; return MUL_OP;} else if (buffer[c] == '*'){ tokenval = MULT; *n = *n-1;
return MUL_OP;}
switch(edo) { case 0: if (buffer[c+1] == '='){ tokenval = LE; return REL_OP;} else { tokenval = LT; *n = *n -1; return REL_OP; } case 1: if ( buffer[c+1] == '=') { tokenval = NE; return REL_OP; } else { tokenval = NINGUNO; *n = *n -1; return (toascii(buffer[c]));} case 2: if (buffer[c+1] == '='){ tokenval = GE; return REL_OP; } else { tokenval = GT; *n = *n -1;
return REL_OP; } case 3: if (buffer[c+1] == '=') { tokenval = EQ; return REL_OP; } else { tokenval = NINGUNO; *n = *n -1; return ASIGNACION; } case 4: if (buffer[c+1] == '|') { tokenval = OR; return ADD_OP; } else { tokenval = NINGUNO; *n = *n -1; return (toascii(buffer[c])); } case 5: if (buffer[c+1]) { tokenval = AND; return MUL_OP;} else { tokenval = NINGUNO; *n = *n -1; return (toascii(buffer[c])); } } }
funciones_simbolos.c
#include "global.h"
int ultima_entrada = 0;
int primer_palabra; static int ultima_palabra = -1; primer_palabra = ++ultima_palabra; ultima_palabra = ultima_palabra + strlen(s); /*Suma a ultima palabra el numero de caracteres de s*/
int inserta (char *s, int tok) /*Inserta el valor y tipo de la palabra reservada en la tabla de smbolos*/ { if(++ultima_entrada >= MAX_SIMBOLOS) error ("Desbordamiento de la Tabla de Smbolos"); tabla_simbolos[ultima_entrada].token = tok; tabla_simbolos[ultima_entrada].lexptr = almacena(s); return ultima_entrada; }
void imprime_simbolos () { if (ultima_entrada) { int i; printf ("\nTABLA SIMBOLOS\nContenido \t Valor \n"); for (i=1; i<=ultima_entrada; i++) printf("%10.60s \t %d\n", get_system(i), get_token(i)); } }
Pruebas.
Para el siguiente archivo.fte programa comienza x = 5 + 5; y = 30; variable1 = 54 - 53 variable2 = 6 * 5 {multiplicacion "variable2 = 30" {otra variable t = x/y; inicio "chalalalalaalal" {otro comentario 45566643 termina Se obtuvo el siguiente conjunto de tuplas: (256 (257 (261 (260 (262 (313 (262 (59 (261 (260 (262 1) 7) 21) -1) -1) 306) 306) -1) 22) -1) -1)
(59 (261 (260 (262 (312 (262 (261 (260 (262 (312 (262 (263 (261 (260 (261 (312 (59 (261 (263 (262 (258 (259
-1) 23) -1) -1) 307) 307) 24) -1) -1) 309) 309) 25) 26) -1) 21) 277) -1) 27) 28) 28) 8) 259)
{comentarioo grande 13455 variable_compiladores = 89304040 $$$ "palabras reservadas" programa comienza termina si x = 5 x=9%9 termina
podria venir 3455 {comentario "otra cadena" termina "nallely flores vicente"
(36 (36 (263 (256 (257 (258 (264 (261 (260 (262 (261 (260 (262 (312 (262 (258 (261 (260 (262 (36 (36 (36 (263 (256 (257 (258 (264
-1) -1) 22) 1) 7) 8) 2) 23) -1) -1) 24) -1) -1) 278) 278) 8) 21) -1) -1) -1) -1) -1) 25) 1) 7) 8) 2)
(261 (260 (262 (261 (260 (262 (312 (262 (258 (261 (261 (262 (263 (258 (263 (259
23) -1) -1) 23) -1) -1) 278) 278) 8) 26) 27) 27) 28) 8) 29) 259)
REFERENCIA BIBLIOGRFICA