You are on page 1of 10

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

CAPTULO III
3. ANLISIS LEXICOGRFICO. EXPLORADORES. 3.1. FUNCIONAMIENTO DEL ANALIZADOR LXICOGRAFICO. El cdigo fuente es un flujo de caracteres. La tarea del analizador lxico es reconocer smbolos en este flujo de caracteres y presentarlos en una representacin ms til para el anlisis sintctico. El analizador Lxico es la parte del compilador que lee los caracteres del programa fuente y que construye unos smbolos intermedios llamados Tokens por ejemplo: las variables, los enteros, palabras reservadas y los delimitadores ( + , - , * ,etc). El explorador realiza un anlisis lexicogrfico del programa fuente, en contraposicin al anlisis sintctico que realizar luego el reconocedor sintctico o parcer. Flujo caracteres de
ANALIZADOR LEXICO

Flujo de smbolos

ANALIZADOR SISNTACTIC O

3.1.1. Interaccin entre el Anlisis Lxico y el Anlisis Sintctico.


Cdigo fuente Componentes lxicos Leer siguiente componente lxico

ANALISIS LEXICO

ANALISIS SINTACTIC

TABLA DE SIMBOLOS

Recibida desde el Anlisis Sintctico, la orden obtener el siguiente componente lxico (o smbolo), el Anlisis Lxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente lxico. 3.1.2. Proceso de Anlisis Lxico. El reconocimiento del Anlisis Lxico puede verse como una transformacin en un flujo de smbolos reducido (entrada filtrada).

Ing. Mst.C. Wigberto Sanchez Pea.

45

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Tambin debe relacionar los mensajes de error del compilador con el programa fuente (Ej.: asociar un nmero de lnea a un mensaje de error). En algunos casos se hace una copia del fuente con los errores marcados, puede realizar preprocesamiento de macros. 3.1.3. El rol del Analizador Lxico. Aunque el analizador lxico es la primera etapa del proceso de compilacin, no es quien lo inicia. Pudiera considerarse que el analizador lxico hace su procesamiento y enva sus resultados al analizador gramatical o sintctico, como secuencialmente se aprecia en el proceso de compilacin; no es as: La compilacin empieza con el analizador gramatical quien solicita un token para realizar su trabajo; el analizador lxico rene smbolos y enva el token correspondiente a la unidad de lxico que conform al analizador gramatical y espera una nueva solicitud de token. Como se aprecia en la figura siguiente, el analizador lxico est supeditado por el analizador gramatical.

Durante estas etapas se tiene comunicacin con la tabla de smbolos que concentra informacin de las entidades empleadas en el programa. 3.1.4. Razones para separar el Anlisis Lxico. A continuacin examinaremos las ventajas de dividir el anlisis de una sentencia en las dos partes lexicogrfica y sintctica. Un tema importante es el porqu se separan los dos anlisis lexicogrfico y sintctico, del programa fuente, cosa perfectamente posible. Algunas razones de esta separacin son las siguientes: Se simplifican las fases: El diseo del analizador sintctico es ms fcil de esta forma, ya que ste no ha de preocuparse de leer el fichero de entrada, ni de saltar blancos, ni comentarios, ni de recibir caracteres inesperados, puesto que todo ello ha sido filtrado previamente por el analizador lexicogrfico. Por tanto, el diseo consiguiente se hace ms claro y comprensible. Una parte muy elevada del tiempo de compilacin se consume en la lectura y exploracin de los caracteres del programa fuente, que se ve reducido si el analizador
Ing. Mst. C. Wigberto Sanchez Pea.

46

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

lexicogrfico incorpora tcnicas especiales de lectura, o est realizado en ensamblador. El analizador puede estar escrito en ensamblador empleando instrucciones para localizar el siguiente carcter especial, lo que acelera mucho el proceso. Se mejora la eficiencia del compilador en su conjunto (Por ejemplo, con tcnicas de manejo de buffers). La sintaxis de los smbolos que trata el analizador se describe con una gramtica mucho ms simple que la del lenguaje a compilar, con o que la escritura del analizador es una tarea relativamente ms sencilla. Se pueden tener varias representaciones externas del mismo programa fuente (diskette, cinta, etc.), o con distintos cdigos (como el ASCII) o con formatos distintos(caracteres de escape, o tabulados, minsculas. etc.). Entonces en vez de tener compiladores diferentes para cada caso bastara tener analizadores diferentes, pero el resto del compilador sera el mismo.

3.1.5. Funciones del Analizador Lexicogrfico. Funcin Principal. Leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos que utiliza el Analizador Sintctico para hacer el anlisis. Funciones Caractersticas. Eliminar espacios, comentarios, caracteres de tabulacin, saltos de lnea, etc. Reconocer identificadores y palabras claves. Reconocer las variables y asignarles una posicin en la tabla de smbolos. Reconocer constantes y numerales. Si el programa fuente incorpora metanociones o macros, el analizador lexicogrfico puede incorporar un preprocesador. Avisa de los errores lexicogrficos que detecta. Generar un listado para el compilador.

3.1.6. Herramientas para la Construccin de Analizadores Lxicos. Componentes Lxicos, Patrones y Lexemas.Hay un conjunto de cadenas en la entrada para el cual se produce como salida el mismo componente lxico (TOKEN). Este conjunto de cadenas se describe mediante una regla llamada PATRN asociado al componente Lxico. PATRN.- Representa la regla para que una secuencia de caracteres sea considerada cierta unidad de lxico. Ejemplo: El patrn para un identificador de Pascal es: Una letra seguida por letras, dgitos o guiones (_)

Ing. Mst.C. Wigberto Sanchez Pea.

47

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Un LEXEMA es una secuencia de caracteres en el programa fuente con la que satisface el patrn para un componente lxico. Los componente lxicos son categoras en que se clasifican las cadenas de caracteres vlidos en un lenguaje. Los caracteres vlidos reciben el nombre de alfabeto. Por ejemplo, el alfabeto de Pascal es: A-Z, a-z, 0-9, _, =, :, ;, ,, , -, ', ", *, /, (, ), [, ], ., <, > y las unidades de lxico para pascal son: Identificadores. Literales numricas. Operadores aritmticos. Cadenas de caracteres. Separadores. Operadores relacionales. Operadores lgicos. Comentarios.

Se consideran componentes lxicos: palabras claves, operadores, identificadores, constantes, cadenas literales, signos de puntuacin. Ejemplo de COMPONENTE LXICO, PATRONES Y LEXEMAS COMPONENTE INFORMAL LEXICO Const If Relacin Id Letras y num Literal LEXEMA DE EJEMPLO Const If <,<=,>,>=, = , <> pi, cuenta, D2 3.1416, 0, 6.2E23 cadena vaca DESCRIPCIN DEL PATRON Const If < o <= o> o >= o = o <> letra seguida de dgitos cualquier constante numrica cualquier carcter

Reconocimiento de Componente Lxico. En algunos casos existe una dificultad potencial de reconocer los componentes lxicos: En Fortran los espacios no son significativos. En : DO 5 I = 1. 25 .... DO 5 I = 1, 25 no se puede saber hasta ver el punto (o la coma) si DO es una palabra clave o es parte del identificador DO5I En PL/I, las palabras claves no son reservadas, lo que complica distinguir claves de identificadores: IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;

48

Ing. Mst. C. Wigberto Sanchez Pea.

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Atributos de los Componentes Lxicos.Cuando concuerda con un lexema ms de un patrn, el Analizador Lxico debe proporcionar informacin adicional sobre el lexema concreto que concord. El Analizador Lxico recoge informacin sobre los componentes lxicos en sus atributos asociados. Los componentes lxicos influyen en las decisiones del Anlisis Sintctico y los atributos en la traduccin de los componentes lxicos. Los componentes lxicos suelen tener un solo atributo (un puntero) a la entrada de la tabla de smbolos donde se guarda la informacin sobre el componente lxico (por ej. el lexema de un identificador y el nmero de lnea donde se encontr por primera vez.) En Fortran : E = M * 2 , los componentes lxicos y los atributos asociados son: <id.puntero a la Tabla de Smbolos para E> <op-asig.> < id. puntero a la Tabla de Smbolos para M> , <op-mul > , <num.valor * 2> Errores Lxicos.Son pocos los errores que puede detectar el Anlisis Lxico por la visin restringida del programa fuente: En C: fi ( a == f(x)) .... No puede distinguir si est mal escrito if, o si fi es identificador de funcin no declarado, por lo que el Anlisis Lxico debe devolver el componente lxico de un identificador y dejar que otra fase se ocupe de los errores. Cuando ninguno de los patrones concuerda con el prefijo de la entrada restante, el Anlisis Lxico puede seguir una estrategia de recuperacin. ( Ejemplos: borrar un carcter extrao, insertar un carcter que falta, reemplazar uno incorrecto por otro correcto, intercambiar dos caracteres adyacentes). Observar si un prefijo de la entrada restante para ver si se puede transformar en un lexema vlido en una sola transformacin de error. Se supone que en general un lexema es vlido si requiere una sola transformacin. Un criterio (terico) de correcciones es el de distancia mnima de un programa. Calcular el nmero mnimo de transformaciones necesarias para transformar el programa errneo en otro que est sintcticamente bien construido. El programa errneo tiene k errores secuencia ms corta de transformaciones de error de longitud k. En cuyo caso la aplicacin es demasiado costosa.

Ing. Mst.C. Wigberto Sanchez Pea.

49

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Manejo de Buffers de Entrada.El Anlisis Lxico es la fase que lee caracter por caracter el PF consume mucho tiempo, aunque las otras fases sean ms complejas. La velocidad de un Anlisis Lxico supone un problema en el diseo de compiladores. Hay 3 mtodos generales para la implantacin de un Anlisis Lxico: Utilizar un generador de Anlisis Lxico, como el LEX para producir un Anlisis Lxico a partir de una especificacin basada en expresiones regulares. Escribir el Anlisis Lxico en un lenguaje de programacin de sistemas, utilizando las posibilidades de e/s de este lenguaje. Escribir el Anlisis Lxico en lenguaje ensamblador y manejar explcitamente la lectura de la entrada. 3.1.7. Representacin e Implementacin de un Autmata. Existen varias formas de representar y escribir un autmata sin perder de vista que es una parte del compilador y son las siguientes: Tabla compacta. Hashing. Autmata programado. Tabla compacta.De acuerdo al siguiente autmata que reconoce el lenguaje regular: L = { dda$, ab ca$ | n > = 0}. Con la finalidad de ahorrar memoria en el ordenador se pueden guardar solos los elementos no nulos de la matriz de transicin M en un vector VALOR, con un ndice que en el ejemplo va de 1 a 7. Luego se aade una columna adicional COL indicando en qu columna estaba el elemento no nulo correspondiente de VALOR. Finalmente se crea otra tabla con los siguientes datos: Donde est el primer VALOR de cada lnea (PRIFIL). Nmero e elementos ( no nulos ) de VALOR para esa lnea ( NUMFIL). Ejemplo de autmata para su representacin e implementacin. Diagramas de estado a
1

d
50

Ing. Mst. C. Wigberto Sanchez Pea.

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Matriz de transicin M Caracteres de entrada a 2 4 b 2 c 3 d 5 3 e 6 -

Si ahora nos proponemos hallar la transicin del estado 2 al llegar el smbolo c, es decir hallar el valor de M [2,3], vemos con PREFIL [2] = 3 que en VALOR [3] y VALOR [ 4 ]. Concretamente el VALOR [4] = 3 tiene como valor de columna COL = 3, luego es vlida la transicin y es el estado M [2,3] = 3. Una funcin PASCAL que realice esta bsqueda es: Function M ( i,j: integer ): integer; Var Num, com, k: integer; Hallado: boolean; NUM. DEL ELEMENTO 1 2 3 4 5 6 7 Valores no nulos de M y sus columnas. NUM. DEL ELEMENTO 1 2 3 4 5 6 Tabla para localizacin de los elementos no nulos Begin Num:= NUMFIL [ i ] ; If num = 0 then M:= 0; Else Begin Com:= PRIFIL [ i ];
Ing. Mst.C. Wigberto Sanchez Pea. 51

VALOR 2 5 2 3 4 6 3

COL 1 4 2 3 1 5 4

VALOR 1 3 5 6 7 0

COL 2 2 1 1 1 0

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

Hallado:= false; K:= 0; While ( k< num ) and not hallado do If COL [ com + k ]= j then Hallado:= true Else K:=k + 1; If hallado then M:= VALOR [ com + k ] Else M:= 0 End End ( * de M * ); Como medida de la reduccin alcanzada, si M tuviera 100 *100 elementos con solo 110 elementos no nulos, se tendra de esta forma 2 * ( 100 + 100 )= 420 elementos almacenados en total, en vez de los 10.000 originales. Hashing.Utilizando el ejemplo anterior consideramos como clave de hashing la concatenacin formada por los dos valores de la fila y columna del elemento no nulo de la matriz ( si no est almacenado, su valor es nulo). Autmata programado.Consiste en representar directamente con un programa al autmata. En el ejemplo anterior el autmata puede escribirse con una sentencia case dentro de un while. El procedimiento leecar entrega el carcter ledo en car, que es una variable global. Estado:= 1; { inicial} While estado <> 6 do begin Leecar; { da en car el siguiente carcter ledo } Case estado of 1: if car = a then estado := 2 else if car = d then estado := 5 else error; 2: if car = c then estado := 3 else if car = b then estado := 2 else error; 3: if car = a then estado := 4 else error; 4: if car = $ then estado := 6 else error; 5: if car = d then estado := 3 else error; 6: error end { de case } end Este mtodo puede ser muy rpido si el ordenador dispone de alguna instruccin para determinar si un carcter pertenece a un conjunto dado ( dgito, letra, etc. ) En este ejemplo si

52

Ing. Mst. C. Wigberto Sanchez Pea.

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

el carcter de entrada no es vlido, se llama simplemente al procedimiento error, aunque sera mejor mediante algn parmetro especificarle el tipo de error ocurrido. 3.2. REALIZACIN DE UN EXPLORADOR. El siguiente ejemplo, corresponde a una definicin restringida del lenguaje de programacin PASCAL: <SENT> -> if <EXP-BOOL> then <SENT> [else <SENT>] <SENT> -> <VAR> : = <EXP> <EXP-BOOL>-> <VAR-BOOL> | <EXP> <COMP> <EXP><COMP> -> < | > | <> | <= | >= | =< | => | = <EXP> -> <EXP> <OP> <FACTOR> | <FACTOR> <FACTOR> -> ( <EXP> ) | <VAR> | <CTE> <CTE> -> <DIGITO> [<DIGITO>] <VAR> -> <LETRA> [<ALFANUM>] <VAR-BOOL>-> <LETRA> [<ALFANUM>] <ALFANUM> -> <LETRA> | <DIGITO> <LETRA> -> a | b | ...... | z <DIGITO> -> 0 | 1 | ...... | 9 <OP> -> + | - | * | / | ** Los smbolos terminales seran los siguientes: T = {, ,a,b,c,... z,(,),+,-,*,/,<,>,=,:} , Son los smbolos de la derecha, siempre y cuando no se encuentren a la derecha de la gramtica. y los smbolos no terminales son: (todos los de la derecha) N={<SENT>, <EXP-BOOL>, <VAR>, <EXP>, <VAR-BOOL>, <COMP>, <OP>, <FACTOR>, <CTE>, <LETRA>, <ALFANUM>, <DIGITO>} Esta gramtica puede ser transformada en la programacin que esta a continuacin y que utiliza el explorador o analizador lexicogrfico: <PRES-IF> -> if <PRES-THEN> -> then <PRES-ELSE> -> else <COMP> -> < | > | <> | <= | >= | =< | => | = <CTE> -> <DIGITO> [<DIGITO>] <VAR> -> <LETRA> [<ALFANUM>] <VAR-BOOL> -> <LETRA> [<ALFANUM>] <ALFANUM> -> <LETRA> | <DIGITO> <LETRA> -> a | b | ...... | z <DIGITO> -> 0 | 1 | ...... | 9 <OP> -> + | - | * | / | ** <ASIG> -> := <ABREPAR> -> (<CIERRAPAR> -> ) cuyos smbolos terminales y no terminales seran: T = {, ,a,b,c,... z,(,),+,-,*,/,<,>,=,:}
Ing. Mst.C. Wigberto Sanchez Pea. 53

PUCESA

ANLISIS LEXICOGRFICO. EXPLORADORES

N = {<PRES-IF>, <PRES-THEN>, <PRES-ELSE>, <COMP>, <CTE>, <VAR>, <VAR-BOOL>, <LETRA>, <DIGITO>, <ALFANUM>, <OP>, <ASIG>, <ABREPAR>, <CIERRAPAR>} Esta gramtica es de tipo 3 segn la clasificacin de Chomsky, que se refiere a la Gramtica de Contexto Libre. 3.2.1. Acciones Semnticas. Un explorador es la primera fase de un compilador, en la que adems de afirmar la correccin de la sentencia de entrada en su aspecto lexicogrfico, debemos traducirla. Para ello asociamos con el autmata unas ACCIONES SEMANTICAS, por ejemplo ir almacenando un identificador o constante real, etc, que al final ser un token entregado a la fase siguiente del compilador. Las Acciones semnticas estn asociadas al parcer. Es decir que un autmata (como un parser) representa solo la mitad de la historia 3.2.2. Scanners y Lenguajes de Programacin. Sabemos que el explorador o scanner agrupa uno o ms caracteres del programa fuente formando un token, para ello se apoya en el concepto de delimitador, que es un carcter que sirve para acabar un token pero sin incluirse en l. En algunos lenguajes de programacin el blanco sirve de delimitador, facilitando el diseo de un scanner, como se describe despus. Otro concepto muy importante de un lenguaje de programacin y que tambin afecta al scanner son las palabras reservadas tales como: begin, if, then, end. Un lenguaje que tiene palabras reservadas es mucha ms fcil de compilar que si no las tiene. Segn las palabras reservadas y el comportamiento del blanco, los lenguajes de programacin se pueden clasificar en: Los blancos son delimitadores y hay palabras reservadas (Pascal, Cobol), los blancos son delimitadores pero no hay palabras reservadas (PL/I). Se puede simplificar si es obligatoria la declaracin de variables. Los blancos se ignoran y no hay palabras reservadas (Fortran, ANS). Es el tipo ms difcil de compilar. Los blancos se ignoran pero hay palabras reservadas (Basic).

54

Ing. Mst. C. Wigberto Sanchez Pea.

You might also like