Вы находитесь на странице: 1из 52

Anlisis Lxico

Tema 2
Juan A. Bota Blaya
juanbot@um.es http://ants.dif.um.es/staff/juanbot/traductores/traductores.html

Departamento de Ingeniera de la Informacion y las Comunicaciones Universidad de Murcia

Analisis Lexico p.1/42

ndice
Introduccin al Anlisis Lxico (AL) Gramticas Expresiones Regulares (ER) Autmatas nitos deterministas y no deterministas Eciencia en el AL Denicin de los tokens Cuestiones de diseo en el AL

Analisis Lexico p.2/42

Anlisis lxico
Funcin principal: generar una lista ordenada de tokens, a partir de los caracteres de entrada. Esos tokens son usados por el AS para construr el rbol sintctico. El AL es un mdulo subordinado al correspondiente del AS
Programa Fuente Analizador Lxico Nuevo Token? Token Analizador Sintctico

Funciones adicionales del AL Eliminacin de caracteres espreos Asistencia en el informe de errores elaborado por el AS Cuenta de nmeros de linea con comentarios, macros Manejo de algunos errores En PASCAL el lexema 0.5 pertenecera al lenguaje y .5 no. Exceder el nmero de caracteres mximo para un identicador.

Analisis Lexico p.3/42

Gramticas
Necesidad de un mecanismo para para expresar lenguajes Un lenguaje L es un conjunto de cadenas Si el nmero de elementos de L es nito L = {c1 , c2 , . . . , cn } Si |L| es innito necesitamos una especicacin nita de innitas cadenas Denicin 1 Una gramtica es una 4-tupla G = (V N , VT , P, S) en donde 1. VN es un conjunto nito de smbolos no terminales (algunas veces denominadas variables sintcticas o categoras sintcticas) 2. VT es un conjunto nito de smbolos terminales, siendo V N VT = . 3. P es un subconjunto nito del conjunto (VN VT ) VN (VN VT ) (VN VT ) Adems, un elemento (, ) P se escribir y se denomina produccin. 4. S es un smbolo especial de VN y se denomina smbolo inicial de la gramtica.
Analisis Lexico p.4/42

Gramticas
Ejemplo 1 Un ejemplo de gramtica es G1 = ({A, S}, {0, 1}, P, S) en donde P contiene las siguientes producciones S 0A1 0A 00A1 A 2

Analisis Lexico p.5/42

Gramticas (II)
Concepto de forma sentencial Denicin 2 Una forma sentencial de una gramtica G = (VN , VT , P, S) se dene recursivamente como sigue: 1. S es una forma sentencial 2. Si es una forma sentencial y est en P entonces es tambin una forma sentencial. Una forma sentencial en G que slo contenga smbolos terminales se denomina sentencia generada por G. El lenguaje generado por una gramtica G, denotado por L(G), es el conjunto de sentencias generadas por G.

Analisis Lexico p.6/42

Expresiones Regulares
Gramtica de Tipo 3. Denicin 3 Las gramticas regulares, se clasican en los dos grupos siguientes: Lineales por la izquierda: aquellas cuyas reglas de produccin son del tipo A a, A V a S ; Lineales por la derecha: aquellas cuyas reglas de produccin son del tipo A a, A aV S , en donde a T y A N , S es el axioma de la gramtica y la palabra vaca. Teorema: un lenguaje L es regular si y slo si es un lenguaje lineal por la derecha (por la izquierda).

Analisis Lexico p.7/42

Expresiones Regulares
Ejemplo 2 La siguiente gramtica G = {{S, A, B, C}, {a, b}, P, S} con el conjunto de producciones siguiente: S aS|aB B bC C aC|a es de tipo tres, lineal por la derecha y genera sentencias del lenguaje L(G) = {an bam |n, m 1}

Analisis Lexico p.8/42

Expresiones regulares
ER (Kleene 1956) nacido como mecanismo para expresar, los lenguajes reconocidos por los auttamas nitos. Denicin 4 Dado un alfabeto , y los smbolos (conjunto vaco), (palabra vaca), + (unin), (concatenacin), (cierre), se dice que: 1. El smbolo es una ER. 2. El smbolo es una ER. 3. a , a es una ER. 4. Si y son dos ER, + y son ER.

5. Si es una ER,

es una ER. Se dene:

=
i=0

i en donde i es igual a la

concatenacin de consigo misma i veces, siendo 0 = . 6. Slo son ER las que expresiones que se obtienen aplicando las reglas anteriores, un nmero nito de veces sobre los smbolos de , y . Adems : El operador tiene la mayor precedencia, asociativo por la izquierda. tiene la segunda mayor precedencia, y es asociativo por la izquierda. +, es el de menor precedencia y tambin es asociativo por la izquierda.
Analisis Lexico p.9/42

ER (II)
La precedencia se puede modicar usando parntesis. Algunos ejemplos a b representa al lenguaje {am bn |m 0, n 0}. (ab) representa al lenguaje {(ab)m |m 0}. (a + b) representa al lenguaje formado por las cadenas que contienen cero o ms casos de una a o b. Es equivalente a (a + b ) .

Analisis Lexico p.10/42

ER (II)
Lenguaje regular Denicin 5 A cada ER, , podemos asociarle un subconjunto de , L(), que se referir al lenguaje regular que describe , segn: Si = , L() = . Si = , L() = . Si = a, L() = {a}. Si y son dos ER, entonces L( + ) = L() Si es una ER, entonces L( ) = L() . Equivalencia de ERs Denicin 6 Dos expresiones regulares y son equivalentes (se escribe = ) si describen el mismo lenguaje, L() = L(). Limitaciones Cmo representar un palndromo?
Analisis Lexico p.11/42

L().

Si y son dos ER, entonces L( ) = L() L().

Autmatas Finitos Deterministas (AFD)


El autmata ms simple es el AFD. Denicin 7 Un AFD es una 5-tupla {Q, , , q0 , F } en donde: Q es un conjunto nito de estados posibles del autmata. es el alfabeto de entrada al autmata. q0 es el estado inicial. F Q es el conjunto de estados nales. : Q Q es la funcin de transicin del autmata. Inicialmente, en el estado q0 . Lee los caracteres de izquierda a derecha. Para cada caracter ledo, si para un a y q, p Q se tiene que (q, a) = p, signica que siempre que el autmata est en el estado q y le llegue el caracter a, pasar al estado p. (q, ) = q q Q, (Q, Aa) = ((A), a) A N, a N . Denicin 8 Una cadena t se dice que es aceptada por un AFD si (q 0 , t) = p, para algn AFD F = (Q, , , qo , F ) tal que t N y p F .
Analisis Lexico p.12/42

Ejemplo de AFD
Autmata que acepta cadenas con un nmero par de ceros y un nmero par de unos. AF D = ({S, A, B, C}, {0, 1}, , S, {S}), (S, 0) = B M se puede denir extensivamente como: (A, 0) = C (B, 0) = S (C, 0) = A Representacin grca
Inicio 1 S 1 0 1 B 1 C 0 A

(S, 1) = A (A, 1) = S (B, 1) = C (C, 1) = B

Entradas Estado S A B C 0 B C S A 1 A S C B
Analisis Lexico p.13/42

Autmatas Finitos No Deterministas (AFND)

Comenzamos con la denicin formal. Denicin 9 Un AFND es una 5-tupla {Q, , , q 0 , F } en donde: Q es un conjunto nito de estados posibles del autmata. es el alfabeto de entrada al autmata. q0 es el estado inicial. F Q es el conjunto de estados nales. : Q 2Q es la funcin de transicin del autmata. Cambia el codominio de la funcin que es el conjunto de las partes de Q. (q, a) = {p1 , p2 , . . . , pn } Cuando el AFND est en q y llega a T , la transicin va a uno de {p 1 , p2 , . . . , p3 }. Completamos la denicin de con : (q, At) =
p(q,A) n

(p, t), en donde A N y t T

({q1 , q2 , . . . , qn }, x) =
i=1

(qi , x)
Analisis Lexico p.14/42

Ejemplo
AFND que reconoce cadenas en {a, b, c} tales que el ltimo smbolo en la cadena de entrada apareca tambin anteriormente en la cadena. En este AFND, Sera F = ({q0 , q1 , q2 , q3 , q4 }, {a, b, c}, , q0 , {q4 })

Smbolos de Entrada Estado q0 q1 q2 q3 q4 a {q0 , q1 } {q1 , q4 } {q2 } {q3 } b {q0 , q2 } {q1 } {q2 , q4 } {q3 } c {q0 , q3 } {q1 } {q4 } {q3 , q4 }

Analisis Lexico p.15/42

Ejemplo
Inicio a a a,b,c q0 q1 a c b

q3

a,b,c

q2

q4

a,b,c

Sea la entrada aca, (q0 , a) (q0 , aca) (q0 , c) (q0 , ca) = = = = = = (q1 , ca) = {q0 , q1 } (q0 , ca) (q0 , a) {q0 , q1 } (q1 , ca) (q3 , a) {q3 } {q0 , q3 } y (q1 , c) = {q1 }

{q0 , q1 , q3 } (q1 , a) = {q1 , q4 }


Analisis Lexico p.16/42

Ejemplo
Concluyendo,

(q0 , aca)

= =

{q0 , q1 , q3 }

{q1 , q4 }

{q0 , q1 , q3 , q4 } F = {q4 }, la cadena se acepta.

y como (q0 , aca)

Analisis Lexico p.17/42

Programando el auttama
Para obtener un reconocedor lxico podemos Obtener el AFD de la ER que describe los tokens y simularlo; Obtener el AFND y despus simularlo Obtener primero el AFND y tras l un equivalente AFD.
AFD

conversin

simulacin

b
ER

c
conversin

conversin

RECONOCEDOR

a
AFND

simulacin

La conversin de una ER en un AFND es menos costosa, que a un AFD Convertir un AFND en un AFD es ms rpido que simular el AFND

Analisis Lexico p.18/42

Ejemplo de implementacin de un AFD Podemos simularlo de dos formas Implementar directamente la funcin Simular las transiciones mediante sentencias if-then-else, case, . . . Implementaremos un analizador lxico capaz de reconocer comentarios denidos como: COMMENT ::= -- CHAR EOL CHAR ::= CUALQUIER CARACTER DISTINTO DE EOL EOL ::= NUEVA LINEA

Analisis Lexico p.19/42

Ejemplo de implementacin de un AFD La tabla de transiciones


ESTADOS 1 2 3 4 2 3 3 EOL a 4 3 b ... ... 3 ... 3 ...

El autmata
CHAR EOL 1 2 3 4

Analisis Lexico p.20/42

Implementacin
Un cdigo que implementa la tabla de transiciones
caracter_actual = getchar(); estado = estado_inicial; while (TRUE){ sif_estado = T[estado][caracter_actual]; if(sig_estado == ERROR) break; estado = sig_estado; caracter_actual = getchar(); if(caracter_actual == EOF) break; } if(es_estado_final(estado)) /*Devolver o procesar el token vlido*/ a else error_lexico(caracter_actual); caracter_actual = getchar(); if (caracter_actual == -){ caracter_actual = getchar(); if (caracter_actual == -){ do{ caracter_actual = getchar(); }while(caracter_actual != \n); }else{ ungetc(caracter_actual,stdin); error_lexico(caracter_actual); } }else error_lexico(caracter_actual);

Analisis Lexico p.21/42

Mejorando la eciencia del AL


Objetivo inmediato minimizar estados del AF Podramos optimizar la representacin interna de Con una nica tabla (array bidimensional) tenemos poca complejidad temporal y alta complejidad espacial Solucin representaciones de ms compactas En la tabla siguiente el 70% de las celdas de la tabla est sin utilizar.

Analisis Lexico p.22/42

Mejorando la eciencia del AL


Ejemplo
b a c a $

d 5

ESTADOS 1 2 3 4 5 6

a 2

b 2

c 3

d 5

4 6 3

Analisis Lexico p.23/42

Mtodo
Almacenamos, numerados, los valores no nulos en un vector VALOR En otro vector COL el ndice de la columna correspondiente en Tenemos la tabla izquierda Adems, en la tabla derecha Una la para cada estado del autmata Nmero de la en izquierda donde comienzan las transiciones del estado Nmero de transiciones del estado

Indice 1 2 3 4 5 6 7

VALOR

COL

Estado 1 2 3 4 5 6

PRIFIL

NUM NO NULOS

2 5 2 3 4 6 3

1 4 2 3 1 5 4

1 3 5 6 7 0

2 2 1 1 1 0
Analisis Lexico p.24/42

Mtodo (II)
/*estado_actual es estado desde el que hacemos la transicin*/ o /*indice_caracter es el ndice correspondiente al carcter de entrada*/ a /*M es el estado al que hacemos la transicin. Si M=0, no hay transicin*/ o o int primer_estado, /*Es el estado desde el que se comienza a buscar el nuevo*/ numero_estados, /*Nmero posible de estados que pueden ser transicin*/ u o pivote; /*Nmero de estados chequeados hasta el momento*/ u boolean hallado; /*False si aun no se ha hallado el estado destino. True si se ha encontrado*/ numero_estados = NUMFIL[estado_actual]; if(numero_estados == 0) M = 0; else{ primer_estado = PRIFIL[estado_actual]; hallado = false; pivote = 0; } while(pivote < numero_estados && !hallado){ if(COL[primer_estado + pivote] == indice_caracter) hallado = true; else pivote++; if(hallado) M = VALOR[primer_estado + pivote]; else M = 0; } printf(El nuevo estado es %d\n,M);

Analisis Lexico p.25/42

Mtodo (III)
En una tabla de transiciones de 100 100 elementos, con nicamente 110 elementos no nulos. Con la representacin compacta tendramos
(2 n_estados) + (2 n_no_nulos) = 420

elementos en total. Con la representacin normal habramos necesitado 10.000 elementos en memoria.

Analisis Lexico p.26/42

Uso de buffers
Es necesario el manejo de buffers sobre los servicios E/S del S.O. Basado en un mecanismo de doble buffer, con N caracteres cada uno Usa punteros forward y lexeme beginning Punteros delimitan el lexema actual
Buffer 1 Buffer 2

N=8

lexeme_beginning

forward

Analisis Lexico p.27/42

Cdigo
if forward est al final de la primera mitad then a begin recargar segunta mitad; forward := forward + 1; end else if forward est al final de la segunda mitad then a begin recargar la primera mitad; pasar forward al principio de la primera mitad; end else forward := forward + 1;

Analisis Lexico p.28/42

Ejemplo

lexeme_beginning forward

Analisis Lexico p.29/42

Ejemplo

lexeme_beginning forward

Analisis Lexico p.29/42

Ejemplo

lexeme_beginning forward

Analisis Lexico p.29/42

Ejemplo

lexeme_beginning forward

Analisis Lexico p.29/42

Ejemplo

lexeme_beginning forward

Analisis Lexico p.29/42

Ejemplo 2

lexeme_beginning forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Ejemplo 2

lexeme_beginning

forward

Analisis Lexico p.30/42

Uso de buffers con centinelas


El enfoque anterior requiere excesivas comparaciones Podemos usar un centineta carcter especial eof
Buffer 1 Buffer 2

N=8

lexeme_beginning

eof

forward

eof

Analisis Lexico p.31/42

Uso de buffers con centinelas


forward := forward + 1; if *forward = eof then begin if forward est al final de la primera mitad then a begin recargar segunta mitad; forward := forward + 1; end else if forward est al final de la segunda mitad then a begin recargar la primera mitad; pasar forward al principio de la primera mitad; end else terminar el anlisis lxico a e end

Analisis Lexico p.32/42

Deniendo y Reconociendo Tokens


El diseo de los tokens es importante Ejemplos Token
const if relacion identicador numero literal

Lexemas ejemplo const if <,,=,<>, pi, cuenta, D2 3.1416, 0, 6.02E23 vaciado de memoria

Patrn no formal const if < = <> letra seguida de letras y dgitos cualquier cte. numrica cualquier carcter entre y excepto

Analisis Lexico p.33/42

Deniendo y Reconociendo Tokens


En la mayora de lenguajes tendremos tokens para palabras clave
IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;

operadores, identicadores, constantes (reales, enteras y de tipo carcter), strings de caracteres y signos de puntuacin Regla: usar tokens sencillos y poco numerosos.

Analisis Lexico p.34/42

Manejo de Errores Lxicos


Qu hacer entonces? Recuperacin en modo pnico: este tipo de estrategia es la ms comun. Consiste en que cuando se detecta una cadena no reconocible, se siguen leyendo caracteres hasta que se vuelve a detectar un token vlido. Borrar un carcter extrao. Insertar un carcter que falta (e.g. reemplazar 2C por 2*C). Reemplazar un carcter incorrecto por otro correcto (e.g. reemplazar INTEJER por INTEGER si el lugar en donde aparece el primer lexema no es el indicado para un identicador) Intercambiar dos caracteres, tokens, adyacentes (e.g. I INTEGER por INTEGER I).

Analisis Lexico p.35/42

Manejo de Errores Lxicos (II)


La recuperacin de errores durante el AL puede producir otros en las siguientes fases.
var numero : integer; begin num?ero:=10; end

el compilador podra producir los siguientes mensajes de error: ERROR LXICO: carcter no reconocido (?) ERROR SEMNTICO: identicador no declarado (num) ERROR SINTCTICO: falta operador entre identicadores ERROR SEMNTICO: identicador no declarado (ero)

Analisis Lexico p.36/42

Manejo de Errores Lxicos (II)


Otras veces no
var i,j: integer; begin i:=1; ? j:=2; end

Analisis Lexico p.37/42

Cuestiones de Diseo
Metodologa Identicar los tokens del lenguaje Denirlos utilizando ER Obtener el AF correspondiente a las ERs que ha de reconocer el AL. Minimizar el nmero de estados del AF. Disear el interface entre la entrada estndar, de donde proviene el programa fuente, y el AL. Especicar qu tipo de manejo de errores va a seguir el AL.

Analisis Lexico p.38/42

Ejemplo de diseo
Vamos a disear el lxico de un lenguaje de programacin denominado MICRO Especicaciones bsicas Tipo de dato: entero. No se declaran variables. Los identicadores empiezan por letra y se componen de letras, dgitos y smbolos de subrayado. Solo hay constantes enteras. Los comentarios comienzan por y terminan con EOL. Sentencias: ID:=expresin; read ( lista de IDs); write ( lista de expresiones entre comas ); Palabras reservadas: begin, end, read, write. Las sentencias se separan con ";". El cuerpo del programa est delimitado por begin/end. Separadores de tokens: espacios en blanco, tabuladores y new-line.

Analisis Lexico p.39/42

Ejemplo de diseo (II)


Expresiones regulares ID : L(L+D+-)* INTLITERAL : D+ LPAREN : ( RPAREN : ) SEMICOLON : ; COMMA : , ASSIGNOP : := PLUSOP : + MINUSOP : SCANEOF : EOF BLANCOS : ( + \n + \t)* COMMENT : C*EOL

Analisis Lexico p.40/42

Implementacin
La implementacin podra ser la que aparece en los archivos lexico.h y lexico.c.
lexico.h

typedef enum token_types { BEGIN, END, READ, WRITE, ID, INTLITERAL, LPAREN, RPAREN, SEMICOLON,COMMA, ASSIGNOP, PLUSOP, MINUSOP, SCANEOF } token; extern token scanner(void); extern char token_buffer[]

Analisis Lexico p.41/42

Implementacin lexico.c
#include "lexico.h" #include <stdio.h> #include <ctype.h> void buffer_char(char c); void clear_buffer(void); token check_reserved(void); void lexical_error(char c); char token_buffer[30]; token scanner(void) { int in_char,c; clear_buffer(); if (feof(stdin)) return SCANEOF; while ((in_char = getchar())!= EOF) { if (isspace(in_char)) continue; /*do nothing*/ else if (isalpha(in_char)) { /* * ID::= LETTER |ID LETTER * |ID DIGIT * |ID UNDERSCORE */ buffer_char(in_char); for(c=getchar();isalnum(c) || c===;c=getchar()) buffer_char(c); ungetc(c,stdin); return check_reserved(); } else if (isdigit(in_char)){ /* * INTLITERAL::= DIGIT | * INTLITERAL DIGIT */ buffer_char(in_char); }} for(c=getchar();isdigit(c);c=getchar()) buffer_char(c); ungetc(c,stdin); return INTLITERAL; } else if (in_char == () return LPAREN; else if (in_char == )) return RPAREN; else if (in_char == ;) return SEMICOLON; else if (in_char == ,) return COMMA; else if (in_char == +) return PLUSOP; else if (in_char == :) /*looking for ":="*/ c = getchar(); if ( c===) return ASSIGNOP; else { ungetc(c,stdin); lexical_error(in_char);} } else if (in_char == -) { /* is it --, comment start */ c= getchar(); if ( c == -) { do in_char = getchar(); while (in_char !=\n); } else { ungetc(c,stdin); return MINUSOP;} }else lexical_error(in_char);
Analisis Lexico p.42/42

Вам также может понравиться