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

UNIDAD III Analisis de Lexico

3.1

Analizador de Lexico
La tarea del anlisis de lxico es reconocer smbolos en un flujo de caracteres y presentarlos en una representacin mas util para el anlisis sintctico. Un analizador de lexico lee el programa fuente carcter por carcter y lo descompone en smbolos basicos llamados TOKENS. El analizador de lexico trata por ejemplo de detectar si los caracteres leidos corresponden a una palabra reservada o un identificador, o si es una constante numerica o literal, o si se trata de algun operador, etc.

Programa fuente como un flujo de caracteres

Analizador De lxico

Flujo de smbolos (tokens)

Analizador Sintctico

Por ejemplo, un programa fuente como el siguiente: VAR i:INTEGER; BEGIN i :=0; END En realidad es leido como un flujo de caracteres V A R i : I N T E G E R ; \n ......

Al leer el programa fuente carcter por carcter Cmo reconocer cada componente del lenguaje ?, Cmo saber cundo es una palabra reservada o un identificador o una cantidad numerica ?

Para disear un analizador de lxico se requiere de: 1) Un mtodo para describir los tokens ( expresiones regulares ) 2) Un mecanismo para reconocer los tokens ( autmatas ) 3) Un mecanismo para realizar acciones sobre los tokens reconocidos, por ejemplo generar una salida, poner su valor en tablas, etc. Los analizadores lxicos deben reconocer componentes lxicos (tokens) y estos componentes forman parte de un lenguaje regular.

Definiciones
Token o componente lxico: Esos son smbolos que se tratan como smbolos terminales de la gramtica del lenguaje fuente. Se consideran componentes lxicos: palabras reservadas, operadores, identificadores, constantes numericas, cadenas literales y signos de puntuacin como parntesis y punto y coma. Lexema: Es una secuencia de caracteres en el programa fuente con la que concuerda el patrn para un componente lxico. Patrn: Es una regla que describe el conjunto de lexemas que puede representar a un determinado componente lxico en los programas fuentes. Componente lxico (Token)
Const If Oprel Id Num num.num Literal

Lexemas de ejemplo
Const If <,<=,=,>,=> PI, cuenta, d2, num1 0, 64, 1234 0.234, 3.1415, 134.00 hola muchachas

Descripcin de los lexemas ( Patrn )


Const If < <= = > => Letra seguida de letras y dgitos Cualquier constante numrica entera. Cualquier constante numerica real. Cualquier carcter entre comillas , excepto

3.2

Introduccion a los Autmatas Finitos y Expresiones Regulares


Expresiones Regulares
Para describir con precisin los patrones de componentes lxicos complejos tal como identificadores, palabras reservadas, constantes numericas o literales, etc. se usa la notacin de expresiones regulares. Las expresiones regulares son una forma compacta de representar un lenguaje regular producido por una gramatica regular o gramatica tipo 3. Tip: Las gramaticas Tipo 2 ( o libres de contexto ) son adecuadas para denotar la secuencia correcta de tokens de una frase o sentencia. En cambio las gramticas Tipo 3 ( o regulares ) son adecuadas para denotar la estructura de cada token. Una expresin regular se construye a partir de expresiones regulares ms simples. Cada expresin regular r representa un token.

Una expresin regular hace uso generalmente de tres operadores: a) concatenacin: representado por . o nada. b) disyuncin: | o + c) cerradura transitiva o simplemente cerradura: ( )* o { }

Definicin de cerradura: Sea A un alfabeto, si utilizamos AA=A2 para designar todas las cadenas de longitud 2 sobre el alfabeto A. AAA = A2A =A3 para designar las cadenas de longitud 3 en A y en general: A . A . A A = An-1A para designar todas las cadenas de longitud n sobre el alfabeto A, entonces la cerradura positiva de A denota A+, se define como:

A+ = AUA2 UA 3 U UAn = UAi i=1 Para complementar, la cadena vaca denotada por A* y definida como: A* = se combina con A+ para formar la cerradura transitiva de A, U A1 UA2 UA3UAn = e U A+

Ejemplo de cerradura: Considere el conjunto de cadenas A* que puede ser generadas del alfabeto A={x,y}, algunos subconjuntos de A* serian: A2 = {xx, xy, yx, yy} A3 = {xxx, xyx, xxy, xyy, yxx, yxy, yyx, yyy}

Reglas para expresiones regulares sobre un alfabeto Expresin Regular donde VT (e1)|(e2) siendo e1 y e2 son ER (e1)|(e2) siendo e1 y e2 son ER (e1)* o {e1} Lenguaje regular que denota { } Conjunto que contiene solo a la cadena vaca { } Conjunto de un solo smbolo: L1 U L2 L1 L2 L1*

Ejemplo: Considere el alfabeto = { 0, 1 } Expresin Regular 110 0|1 (1)* 1* (0|1)(0|1) o bien 00|01|10|11 (0|1)* (0)* (1)* Lenguaje que denota L{110} L{0,1} L{1i |i=0,1,2,..} L{00,01,10,11} L{ x | x {0,1}* } L{ 0m 1n| m,n>=0} Ejemplos de smbolos 110 no ms 0, 1 , 1,11,111,1111..2 00,01,10,11 , 011, 00, 11, 000, 111, 01, 10, 101001 , 01, 0011, 000, 111.infinito

1) 2) 3) 4) 5) 6)

Definiciones regulares
Si es un alfabeto de smbolos bsicos, entonces una definicin regular es una secuencia de definiciones de la forma: d 1 r1 d 2 r2 d n rn donde: di es un nombre distintivo, ri es una expresin regular sobre smbolos de d2,,dn} Ejemplo: Definicin regular para denotar a los identificadores Letra -> a|b|c|d||z|A|B||Z Digito -> 0|1|2|3|4|5|9 Id -> letra ( letra | digito )* La definicin regular anterior es mas compacta que utilizar la gramtica regular equivalente siguiente: I -> L I -> LA A -> LA A -> DA A -> L A -> D L -> a|b|c|A|B|C|Z D -> 0|1|2|3|..|9 U { di,

Autmatas (Reconocedores)
Autmata o reconocedor, tambin llamado frecuentemente maquina lgica: 1.- Es un modelo formal. 2.- Puede utilizar una notacin grafica en forma de diagrama de estados. 3.- Se utilizan para reconocer cadenas o smbolos de un lenguaje.

Cadena Reconocedor

Si pertenece al lenguaje (Lenguaje Regular)

No pertenece al lenguaje

Tipos de autmatas: 1. Maquina de Turing: Es el reconocedor de lenguaje producido por una gramtica tipo 0. 2. Autmata lineal restringido: Es el reconocedor del lenguaje producido por una gramtica tipo 1. 3. Autmata de pila (Push Down Autmata): Es el reconocedor del lenguaje producido por una gramtica tipo 2.

4. Autmata finito: Es el reconocedor del lenguaje producido por una gramtica tipo 3.

Automata finito
Un autmata finito consiste de un conjunto finito de estados y un conjunto de transiciones de estado a estado, que ocurren bajo una entrada de smbolos seleccionados de un alfabeto , para cada smbolo de entrada hay una transicin a otro estado o posiblemente al mismo. Definicin formal: M = < Q, , , q0, F > donde: Q q0 Q F incluido en Q = Conjunto finito no vaci de estados = Conjunto de smbolos de entrada (alfabeto) = Funcin de transicin = Estado inicial = Conjunto de estados finales

El autmata finito lee los smbolos secuencialmente de izquierda a derecha. Inicialmente se parte de q0. Una cadena se dice que es aceptada por M si existe alguna (q0 ,W) = P para P F. El conjunto de cadenas aceptadas por M denotada por L (M) es: L (M)= {W | ( q , w) F y W * } Cualquier conjunto de cadenas aceptadas por un autmata finito se dice que es regular.

Ejemplo de un Autmata Finito: Sea M = < Q, , , qo, F> donde: Q = { q0, q1, q2, q3 } = {0,1} Funciones: (q0,0)=q2 (q1,0)=q3 (q2,0)=q0 (q3,0)=q1 (q0,1)=q1 (q1,1)=q0 (q2,1)=q3 (q3,1)=q2 F = {q0}

El lenguaje regular reconocido por el automata finito M denotador por L(M) es : L(M)={ ( 0 | 1 )* | el numero de 0s y 1s es par }

Ejemplo: Verificar si la cadena anterior. Entrada 1 1

110101

pertenece al lenguaje regular reconocido por el automata M

Estado actual del reconocedor q0 (q0,1)=q1 q1 (q1,1)=q0 q0 (q0,0)=q2 q2 (q2,1)=q3 q3 (q3,0)=q1 q1 (q1,1)=q0 q0 Estado final por lo tanto la cadena es valida

Autmata finito grafico (Diagramas de transicin)


Para representar el comportamiento de un analizador lexicografico podemos hacerlo mediante un diagrama que se construye bajo las siguientes reglas: 1.- Cada miembro de Q se representa por un crculo etiquetado con el estado en cuestin, por ejemplo: q3. 2.- Cada uno de las funciones de movimiento se representa con una flecha que va del estado izquierdo al estado derecho de la funcin y la flecha es etiquetada con el smbolo de entrada por ejemplo: (q3, a ) = q1 a q3 q1

3.- Los estados finales se marcan generalmente con doble crculo. 4.-Al estado inicial se le distingue con una flecha que no sale de ningn otro crculo.

q0

Ejemplo: Trazar el diagrama de transiciones para las siguientes funciones de transicin: (q0,a)=q3 (q3,b)=q4 (q4,a)=q0

a
q0

q3 a q4 b

Diagramas de transicin de expresiones regulares primitivas

Expresin Regular

Diagrama

0 a a|b 0 0
b
b 1 2

a a

1 1

ab a*

a 0

Ejemplo: Sea la expresin regular ( a | b )* abb que representa a las cadenas formadas por ai y bj donde i, j => 0 y estan terminadas en abb si la descomponemos en las sub-expresiones regulares R1 y R2 tal que R1 = ( a | b )* R2 = abb

Para R1

para R2

Concatenandolos
a

0 b

a a b

a b b 1 2 3
b

Cadenas generadas: 1) abb 2) aaabb 3) bbbabb 4) ababababb etc

Tipos de autmatas finitos


= = Autmata Finito No-Deterministico (AFN) Autmata Finito Deterministico ( AFD )

Autmata Finito No Deterministico: 1. 2. 3. 4. Un AFN tiene transiciones etiquetadas con cadena vaca ( ) o con un simbolo de entrada. Un mismo carcter puede etiquetar dos o mas transiciones. Tiene un estado inicial y puede tener uno o mas estados finales. No es facil de simular con software debido a la ambigedad presentada por la situacin de que de un estado pueden salir dos o mas transiciones originadas por el mismo smbolo de entrada.

Autmata Finito Deterministico: 1. Un AFD no tiene transiciones vacas. 2. Para cada estado S y un smbolo de entrada existe a lo mas una flecha etiquetada con de la siguiente manera:

NOTA: Se puede convertir un AFN a un AFD mediante un algoritmo de transformacin.

Ejemplo de implementacin de un analizador de lexico para identificadores


El automata finito grafico que define a los identificadores es:

Letra o digito

Letra

Delimitador

Se pueden construir rutinas que ejecuten funciones utiles: Getchar ( ) Letra ( C ) Digito ( C ) Delimitador ( C ) Retroceder ( C ) Fallo ( ) Insertar ( ) Return ( ) Lee un carcter y avanza un carcter en el buffer. True si C una letra. Trae si C es digito. True si es delimitador. Regresa el apuntador a un carcter (el correspondiente al delimitador ya que este no forma parte del identificador ). Regresa el apuntador e inicia el siguiente autmata. Mete el identificador a la tabla de smbolos y regresa la posicin dentro de la tabla. Regresa id que es el token para un identificador y el apuntador a la tabla de smbolos.

El pseudocodigo para cada estado del automata finito grafico anterior seria: Estado 0: c := Getchar ( ); IF Letra ( c ) THEN GOTO ESTADO 1 ELSE FALLO ( ); c := Getchar (); If Letra ( c ) OR Digito ( c ) THEN GOTO ESTADO 1 ELSE IF Delimitador ( c) THEN GOTO ESTADO 2 ELSE FALLO (); RETROCEDER (); RETURN ( id, insertar ( ) )

Estado 1:

Estado 2:

Otro ejemplo: Considerar la sentencia IF-THEN-ELSE soportada en muchos lenguajes de programacion IF <expr> oprel <expr> THEN BEGIN <accin> END ELSE BEGIN <accin> END Las expresiones regulares para los tokens de esta sentencia son: PalabraReservada = BEGIN | END | IF | THEN | ELSE Identificador = Letra ( Letra | Digito )* NumEntero = Digito+ Oprel = > | < | = | >= | <= | <> Letra = a|b|c||A|B|C|..|Z Digito = 0|1|2|.|9

Los autmatas graficos individuales serian:

1
E

2 9

3 10

RETURN ( BEGIN ) RETURN ( END ) RETURN ( IF ) RETURN ( THEN ) RETURN ( ELSE )

7
11 I

8
12 F

13

E N 14 T 15 H 16 17 18 19 E 20 L
Letra

21

22

23

RETURN ( id, insertar ( ) )


25 Letra o Digito Digito

24
Digit

26
<

27

RETURN ( num, insertar () ) RETURN ( oprel )

28 30 <
=

29
=

RETURN ( oprel )
32

31

RETURN ( oprel )
34
>

33

35 < 36 38
>

37

RETURN ( oprel ) RETURN ( oprel ) RETURN ( oprel )

39
=

40 >

41

42

Este analizador de lexico estaria formado por el codigo que implementa cada uno de los autmatas anteriores. Cuando un flujo de caracteres de entrada empata con uno de los autmatas entonces se devuelve su Token correspondiente.

Si ocurre que los caracteres de entrada no empatan con ningun automata significa un error de lexico, es decir, el carcter de entrada es desconocido para el lenguaje.

3.3

Manejo de localidades temporales de memoria ( buffers )


Buffers de Entrada
Buffer del programa fuente

Analizador De lxico

Buffer de tokens Buffer de lexemas

Analizador Sintctico

1. El buffer del programa fuente se implementa como una simple cadena o String. 2. El procesamiento de buffer del programa es carcter por carcter. 3. Los buffers de tokens y lexemas sirven como buffers de entrada al anlisis sintctico, en la practica se implementan como un solo buffer. NOTA: Generalmente el termino Buffer de Entrada se refiere al buffer que entra al analizador sintactico. 4. Tres datos que puede mantener cada localidad del Buffer de Entrada serian: 1. Token 2. Lexema 3. Entrada o apuntador a la tabla de smbolos Esquematicamente: Complex Begin id num Oparit literal End If Else Lexema Begin Num1 S + hola End If Else Entrada 0 1 2 0 3 0 0 0

5. El Buffer de Entrada se implementa mediante una estructura de datos u objetos, con las siguientes operaciones bsicas: 1. 2. 3. 4. 5. Inicializar ( ) Insertar ( t, l, e ) Siguiente ( ) Obt_elemento ( x ) reestablecer ( ) elimina toda la informacin del buffer y pone el puntero del buffer en la localidad inicial. inserta una nueva lnea en el buffer con token t , lexema l y un apuntador a la tabla de smbolos e . avanza el puntero del buffer una localidad. devuelve el elemento ubicado en la localidad x. mueve el puntero del buffer a la primera localidad.

Modelo de clases para una implementacion de Buffer de Entrada


TBufferEnt - arrBuffer [ MAXBE ] + preAnalisis - intPtr :TLinea_BE :TLinea_BE : entero + complex + lexema + entrada TLinea_BE : cadena : cadena : entero

+ + + + +

inicializar () insertar ( TLinea_BE L) : entero siguiente () obt_elemento (entero e) : TLinea_BE reestablecer ()

Como funciona un objeto de la clase TBufferEnt ?


Ptr

Complex Begin id num Oparit literal End If Else $

Lexema Begin Num1 S + hola End If Else $

Entrada 0 1 2 0 3 0 0 0 0

preAnalisis
Begin Begin 0

El smbolo $ es una marca de terminacion del buffer. Inicialmente el buffer esta vacio y solo tiene el smbolo $ en la primer localidad, el indice Ptr se coloca en la posicin inicial. Los smbolos se van insertando al buffer consecutivamente, desplazando siempre a $ al final del buffer. El preAnalisis mantiene una copia de la localidad apuntada por Ptr. localidad preAnalisis toma los valores de esa localidad. Conforme Ptr se mueva de

Cdigo ejemplo de implementacin del Buffer de Entrada


class TLinea_BE { public: AnsiString complex; AnsiString lexema; int entrada; TLinea_BE { lexema = ; complex = ; entrada = 0 ; } }; class TBufferEnt { TLinea_BE arrBuffer [MAXBE]; int intPtr; public: TLinea_BE preAnalisis; void reestablecer (); void inicializar (); void siguiente (); int inserter ( TLinea_BE &L); TLinea_BE obt_elemento (int e); };

3.4

Creacion de tablas de simbolos


Una funcin esencial de un compilador es registrar los identificadores de usuario (nombres de variables, de funciones, de tipos, etc.) utilizados en el programa fuente y reunir informacin sobre los distintos atributos de cada identificador. Estos atributos pueden proporcionar informacin sobre la memoria asignada a un identificador, la direccin de memoria en que se almacenar en tiempo de ejecucin, su tipo, su mbito (la parte del programa donde es visible), etc. La tabla de smbolos es un componente importante del compilador. Mediante el eso de esta tabla el compilador registra y lleva un control de la informacin acerca de todos los smbolos reconocidos y objetos que este manejando, tales como: tipo de dato nombre dimension linea de declaracion lineas en que se hace referencia numero de parmetros etc. En general la tabla de smbolos se forma por el smbolo o nombre en cuestion y una serie de atributos. Smbolo Atributo 1 ........ Atributo n

Tipos de Tablas de Smbolos: de palabras reservadas de Constantes

de Procedimientos El uso de diferentes tablas depende de que tan sofisticado sea el compilador.

Modelo de clases para una implementacion de Tabla de Simbolos


El siguiente modelo representa las clases para una tabla de smbolos para identificadores y constantes. La tabla mantiene solo un atributo llamado tipo, usado para registrar el tipo de dato de cada identificador y constante.

TTablaSimb - arrTabla [ MAXTS ] - intInd + + + + + + :TLinea_TS : entero 1 inicializar () insertar ( TLinea_TS L ) : entero obt_elemento (entero e) : TLinea_TS anadeTipo ( entero p, cadena t ) buscaTipo ( entero p ) : cadena buscar ( cadena lex ) : entero * + complex + lexema + tipo

TLinea_TS : cadena : cadena : cadena

Como funciona un objeto de la clase TTablaSimb ?


Complex 0 1 2 3 4 5 id id num num.num literal Lexema Num1 promedio 45 3.1415 hola Tipo int float int float char

Ind

La entrada 0 de la tabla de smbolos se reserva, no se usa. Ind es un indice al ultimo elemento insertado. La operacin anadeTipo ( p, t ) va a la localidad p y llena la columna TIPO con el valor t. La operacin buscaTipo ( p ) va a la localidad p y devuelve el valor de la columna TIPO. La operacin buscar ( lex ) hace una busqueda sobre la columna LEXEMA buscando el valor lex, si lex no se encuentra devuelve 0.

Pag. 39

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