Vous êtes sur la page 1sur 12

Compiladores Analizador Lxico

Universidad Nacional Autnoma de Mxico


Facultad de Ingeniera

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Compiladores
Grupo 1

Analizador Lxico en LEX

ALUMNOS:
ARGUETA CORTES JAIRO I. MENDOZA GAYTAN JOSE TRINIDAD

PROFESORA:
ING. LAURA SANDOVAL M.

Lunes 12 de Octubre de 2009

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

INDICE
Anlisis.. 3 Estudio preliminar..3 Planeacin.....4 Propuesta de servicios...5 Diseo.5 Expresiones regulares .. 6 Desarrollo 7 Definicin de tokens.. 7 Tcnicas de bsqueda e insercin. 10 Implementacin. 11 Ejecucin de programa SQLex.c. 16

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Analizador lxico en LEX


Anlisis. Estudio preliminar. Objetivo: Elaborar un analizador lxico en Lex o Flex que reconozca los componentes lxicos pertenecientes a las clases debajo descritas. Lista de requerimientos: Las clases de los componentes lxicos validos para el analizador lxico son: o o o o o o o o Clase 0 1 2 3 4 5 6 Descripcin Palabras reservadas Constantes enteras (sin signo) Cadenas encerradas entre apostrofes Operadores relacionales Operadores aritmticos Identificadores (Slo letras) Smbolos especiales

o El nmero de las clases es inamovible. El analizador lxico tendr como entrada un archivo con el programa fuente. Que se deber dar en la lnea de comandos al ejecutar el analizador lxico. Como delimitador de un componente lxico ser uno varios espacios, tabuladores o saltos de lnea, as como el inicio de otro componente lxico. Cuando detecte un error lxico, deber seguir el reconocimiento a partir del siguiente smbolo valido. El analizador deber crear la tabla de smbolos con2 campos: nombre y tipo. Y otra tabla de cadenas con un solo campo. Los tokens contendrn 2 campos. o Campo1: la clase (entero de un byte). o Campo2: el valor (de acuerdo a las sig. Tablas). o El valor para el token de cada identificador es la posicin dentro de la tabla de smbolos, para las cadenas su posicin en la tabla correspondiente y de las constantes enteras su valor numrico. El analizador lxico generar una cadena de tomos (de acuerdo a las tablas presentadas ms abajo).

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Palabras reservadas Palabra Valor tomo CONCAT 0 u CREATE 1 c DEFAULT 2 d DROP 3 b FROM 4 f INSERT 5 i INTO 6 a KEY 7 k NOT 8 n NULL 9 e PRIMARY 10 p SELECT 11 s TABLE 12 t VALUES 13 v WHERE 14 w CHAR 15 h INTEGER 16 z

Operadores arieticos Operador Valor tomo + + + / / /

Operadores relacionales Operador = <> < > >= <= Valor 0 1 2 3 4 5 tomo = ! < > g l

Smbolos especiales Smbolo Valor tomo

, ; * ( )

, ; * ( )

, ; * ( )
Valor Equivalente en decimal Posicin en la tabla Posicin en la tabla tomo # q y

Constantes enteras sin signo Cadena de caracteres Identificador

Como resultados, el analizador lxico deber mostrar el contenido de la tabla de smbolos, los tokens y la cadena de tomos Los errores que vaya encontrando el analizador lxico, los podr ir mostrando en pantalla o escribirlos en un archivo. Planeacin. Se cuenta con un total de 5 das para la entrega del proyecto por lo que la organizacin quedara de la siguiente manera: El programa del analizador lxico se dividir en tres mdulos:

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

MOD I: Se definirn las expresiones regulares para trabajar en FLEX, as como sus componentes lxicos y se implementara su cdigo correspondiente. MOD II: Se implementaran las funciones requeridas para generar los tokens, y cadena de tomos MOD III; Se implementaran las funciones requeridas para la creacin de la tabla de smbolos y de caracteres. Distribucin de tiempos: Tiempo de anlisis y diseo. Tomando en cuenta los requerimientos y alcance del proyecto se realizara en un total de 2 das. Tiempo de desarrollo. Ser el tiempo restante antes de la entrega del proyecto en este caso ser un total de 3 das naturales. Asignacin de labores: Tomando en cuenta el tiempo con el que se cuenta, as como los recursos y alcance del proyecto se organizara de la siguiente manera: Desarrollador1.- Argueta Cortes Jairo I. (D1) Desarrollador2.- Mendoza Gaytn Jos T. (D2) Propuesta de servicios. La forma en la que se dar solucin a los requerimientos presentados ser la siguiente: Se cuenta con un total de 5 das para la entrega del proyecto por lo que las actividades relacionadas con el desarrollo del proyecto se tendrn que adecuar a este No. De das. Objetivo.- Que la Ing. Laura Sandoval Montao obtenga el programa de Analizador lxico en tiempo y forma establecidos por la misma, cumpliendo con todos y cada uno de los requerimientos antes establecidos. Entregables del proyecto.- se realizara la entrega de: El anlisis, diseo y desarrollo as como la forma en la que el programa se puede implementar. Se entregara adems el cdigo fuente del programa as como un archivo ejecutable del mismo, esto se realizara de manera electrnica mediante el correo electrnico y de forma escrita mediante un documento.

Diseo. Para poder cumplir con los requerimientos especificados en el presente programa se tendr que partir desde la creacin de expresiones regulares hasta su implementacin en FLEX.

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Expresiones regulares Identificadores. <let> = A|B||Z|a|b|z <ident>= <let>+ Smbolos <smbolo> = ,| ; | *| ( | ) Operador aritmtico <opArit> = +| - | / Operador Relacional <opRel> = <>|<|>|<=|>= Cadenas <caracter>= A|B||Z|a|b|z|!||#|$|%|&|/|(|)|=|?||/|*|-|+||>|<||||@ <comilla>= <cadena> =<comilla><caracter>*<comilla> Constantes enteras <dig>= 0|1|2|3|4|5|6|7|8|9 <entero>=<dig>+ Palabras reservadas <palres> =CONCAT|CREATE|DEFAULT|DROP|FROM|INSERT|INTO|KEY|NOT|NULL|PRIMARY|SELECT|TA BLE|VALUES|WHERE|CHAR|INTEGER

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Desarrollo.
Definicin de la tabla de smbolos y de caracteres Para trabajar con la tabla de smbolos (identificadores) la definimos de la siguiente manera: TABLA DE SIMBOLOS Nombre TABLA DE CADENAS Nombre

Clase

Valor

Valor

Para lo cual trabajamos con una estructura en C. definida de la siguiente manera typedef struct sim { int ClaseS; //Clase del Smbolo int valorS; //Valor del smbolo char simbolo[20]; //Smbolo struct sim *siguiente; //Puntero al siguiente smbolo } tablaSimbolos; Esta estructura nos permitir trabajar con listas ligadas, es por eso que trabajamos con struct sim *siguiente que es un apuntador al siguiente elemento. Este tipo de utilizacin de estructuras de datos nos permitir optimizar memoria, ya que podramos haber utilizado una matriz multidimensional de un tamao fijo, lo que sera difcil de modificar en su tamao aunque simplificara mas el cdigo. Definicin de Tokens Cada TOKEN tiene dos campos definidos de la siguiente manera (Clase, Valor) Clase 0 Palabras reservadas
//Estructura para definir Palabras reservadas {palabra,valor,atomo} 27 struct palabraS{ 28 char palabra[10]; //Palabra 29 int valor; //Valor 30 char atomo; //atomo 31 } palabraRes[17] = {{"CONCAT",0,'u'},{"CREATE",1,'c'},{"DEFAULT",2,'d'},{"DROP",3,'b'}, 32 {"FROM",4,'f'},{"INSERT",5,'i'},{"INTO",6,'a'},{"KEY",7,'k'}, 33 {"NOT",8,'n'},{"NULL",9,'e'},{"PRIMARY",10,'p'},{"SELECT",11,'s'}, 34 {"TABLE",12,'t'},{"VALUES",13,'v'},{"WHERE",14,'w'},{"CHAR",15,'h'}, 35 {"INTEGER",16,'z'} 36 };

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Clase 1 Constantes enteras (sin signo) Clase 2 Cadenas encerradas entre apostrofes Clase 3 Operadores relacionales
45 //Estructura para definir Operadores relacionales {operador,valor,atomo} 46 struct opRelacional { 47 char operador[2]; //Operador 48 int valor; //Valor 49 char atomo; //atomo 50 } operadorRel[6] = {{"=",0,'='},{"<>",1,'!'},{"<",2,'<'},{">",3,'>'},{">=",4,'g'},{"<=",5,'l'}};

Clase 4 Operadores aritmticos


38 //Estructura para definir Operadores arimeticos {operador,valor,atomo} 39 struct opAritmetico { 40 char operador; //Operador 41 char valor; //Valor 42 char atomo; //atomo 43 } operadorArit[3] = {{'+','+','+'},{'-','-','-'},{'/','/','/'}};

Clase 5 Identificadores (Slo letras) Clase 6 Smbolos especiales


52 //Estructura para definir Simbolos especiales {simbolo,valor,atomo} 53 struct simbolos { 54 char simbolo; //Operador 55 char valor; //Valor 56 char atomo; //atomo

57 } simboloEsp[5] = {{',' , ',' , ','},{';', ';' ,';'},{'*', '*' ,'*'},{'(', '(' ,'('},{')', ')' ,')'}};

Tcnicas de bsqueda e insercin La tcnica de bsqueda es lineal para nuestras listas ligadas que viene siendo la tabla de smbolos por lo tanto cuando el autmata reconoce un Identificador, primero lo busca en la tabla de smbolos y si este se encuentra toma el valor correspondiente en la tabla se smbolos y genera en Token. En caso de que el smbolo no se encuentre en la tabla, lo inserta y le asigna un valor para poder generar el Token correspondiente.

Compiladores Analizador Lxico

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

El algoritmo est definido en C de la siguiente manera:


void buscaSimbolo(int ClaseB, char *CadenaB) { //aux apunta al inicio de la tabla de simbolos aux = inicioTabla; //Bandera que indica si encontro el simbolo int encontro = 0; //Inicializacion de la tabla por primera vez if(ContadorS==0) { insertaSimbolo(ClaseB, CadenaB); aux = inicioTabla; printf("( %d , %d )\n", aux->ClaseS, aux->valorS); encontro=1; } //Loop que busca un simbolo en la tabla while (encontro==0) { //Si encuentra el simbolo en la tabla //imprime clase y valor correspondiente if(strcmp(aux->simbolo,CadenaB)==0) { printf("( %d , %d )\n", aux->ClaseS, aux->valorS); encontro=1; } //Apunta al siguiente elemento de la tabla else aux = aux->siguiente; //Si no encuetra el simbolo lo inserta en la tabla if(aux==NULL) { insertaSimbolo(ClaseB, CadenaB); aux = inicioTabla; printf("( %d , %d )\n", aux->ClaseS, aux->valorS); encontro=1; } }

La implementacin de la tabla de caracteres es idntica que una tabla de smbolos. Solamente asignamos nuevos nombres a las variables a utilizar.

Compiladores Analizador Lxico

10

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Ejecucin de Programa SQLlex.c En una terminal de Linux teclear lo siguiente: boxer@boxer-desktop:~/Escritorio$flex SQLex.l boxer@boxer-desktop:~/Escritorio$ gcc lex.yy.c -lfl boxer@boxer-desktop:~/Escritorio$./a.out [nombreArchivo].txt

En [nombreArchivo] se sustituye por el nombre del archivo fuente, para nuestro caso de ejemplo utilizamos SQL.txt El archivo SQL.txt contiene el siguiente texto:
CREATE TABLE ( nombre CHAR(10)PRIMARY KEY DEFAULT 'jairo' ); SELECT * FROM TRABAJADOR WHERE nombre='jairo' ; INSERT INTO trabajador (nombre,tel,dir) VALUES('jose',56303435,'la cruz'); = > < <> >= <= + - / $$$$"""""""{}{}{}{}{} , ; *

Al teclear en consola: boxer@boxer-desktop:~/Escritorio$ ./a.out SQL.txt

Las respectivas salidas se presentan en tres archivos de escritura: Error.txt: Contiene los errores detectados por el analizador lxico Tokens.txt: Contiene la lista de tokens, la tabla de smbolos (identificadores) y la tabla de cadenas Cadena.txt; Contiene la cadena de tomos.

Compiladores Analizador Lxico

11

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

Analizando los resultados primero observamos una lista de TOKENS generados por el analizador LEXico, la tabla de smbolos, as como la tabla de cadenas: Tokens.txt
*-*-*-*-*-*TOKENS.*-*-*-*-*-*-* 0 , 1 0 , 12 6 , ( 5 , 0 0 , 15 6 , ( 1 , 10 6 , ) 0 , 10 0 , 7 0 , 2 2 , 0 6 , ) 6 , ; 0 , 11 6 , * 0 , 4 5 , 1 0 , 14 5 , 0 3 , 0 2 , 0 6 , ; 0 , 5 0 , 6 5 , 2 6 , ( 5 , 0 6 , , 5 , 3 6 , , 5 , 4 6 , ) 0 , 13 6 , ( 2 , 1 6 , , 1 , 56303435 6 , , 2 , 2 6 , ) 6 , ; 3 , 0 3 , 3 3 , 2 3 , 1 3 , 4 3 , 5 4 , + 4 , 4 , / 6 , , 6 , ; 6 , *

Compiladores Analizador Lxico

12

Argueta Cortes Jairo I. Mendoza Gaytn Jos Trinidad

TABLA DE SIMBOLOS -------------------------| Clase | Nombre | Valor | -------------------------| 5 dir 4| | 5 tel 3| | 5 trabajador 2| | 5 TRABAJADOR 1| | 5 nombre 0| -------------------------TABLA DE CADENAS -------------------------| Nombre | Valor | -------------------------| 'la cruz' 2| | 'jose' 1| | 'jairo' 0| --------------------------

Cadena.txt
*-*-*-*-*-*La cadena de Atomos es la siguiente:*-*-*-*-*-*-* ct(yh(m)pkdx);s*fywy=x;iay(y,y,y)v(x,m,x);=><!gl+-/,;*

Error.txt
*-*-*-*-*-*Errores encontrados en el archivo SQL dado.*-*-*-*-*-*-* $ $ $ $ " " " " " " " { } { } { } { } { } es es es es es es es es es es es es es es es es es es es es es un un un un un un un un un un un un un un un un un un un un un Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error Error

Vous aimerez peut-être aussi