You are on page 1of 63

Analizador Lxico

Aspectos bsicos
Es la primera fase del compilador.
Principales funciones:
Leer los caracteres de entrada y elaborar como

salida una secuencia de componentes lxicos (tokens), los cuales son usados por el analizador sintctico para realizar su anlisis. Eliminar espacios en blanco, tabuladores, caracteres de nueva lnea. Eliminar comentarios Relacionar errores con la posicin en el fuente

Aspectos bsicos
Mltiples motivos para tener una etapa aparte
Sencillez de diseo, al separar convenciones

lxicas y sintcticas Mejoras de eficiencia Mejoras en la portabilidad del compilador. Peculiaridades del alfabeto y la existencia de caracteres especiales se aslan en el analizador lexicogrfico

Interaccin del analizador de lxico y el analizador sintctico

Conceptos
Token.- Es un smbolo abstracto que representa a un tipo de

unidad lxica. Esta Formado por el nombre del token y un valor de atributo opcional.
Patrn.- es una descripcin de la forma que pueden tomar los

lexemas de un token. En el caso de una palabra clave como token, el patrn es solo la secuencia de caracteres que forma la palabra clave. Para los indicadores y algunos otros tokens, el patrn es una estructura ms compleja.
Lexema.- Es una secuencia de caracteres en el programa fuente,

que coinciden con el patrn de un token y que el analizador lxico identifica como una instancia de ese token.

Ejemplo: Const pi = 3.1416;


Lexema Const If Descripcin informal del patrn Const If Token Const If Relacin Id Num Literal

<,<=,=,>,> < <= = >= > = Pi 3.1416 cadena Letra seguida de letras y nmeros Cualquier constante numrica Cualquier carcter entre . Excepto

Atributos para los tokens


En muchos casos el analizador de lxico devuelve al

analizador sintctico no solo el nombre del token, sino un valor de atributo que describe el lexema que representa ese token.

Errores Lxicos
Tiene una visin muy restringida del fuente, a nivel de

cadena. No lo ve a nivel de frases.


Por ejemplo:
fi(a == f(x))
No puede saberse a priori si fi es un error o una

funcin aun no definida


Sin embargo existen algunas alternativas cuando no

existe concordancia de patrones:

Errores Lxicos
Recuperacin en modo pnico: Es la estrategia ms comn.

Cuando se detecta una cadena no reconocible se eliminan sucesivamente los caracteres hasta detectar un token vlido. Esta estrategia puede confundir al analizador sintctico.
Insertar un carcter que falta: 2C por 2*C .
Reemplazar un carcter incorrecto por otro correcto: intejer

por integer.
Intercambiar dos caracteres adyacentes:

x integer por

integer x .

Uso de buffers de entrada


Como el analizador de lxico es la nica fase que lee el

programa fuente es posible que consuma mucha tiempo.

Pareja de Buffers

Centinelas

Especificacin de los tokens

Definiciones
Alfabeto.- es un conjunto finito de smbolos.

Ejemplos: {0,1}, ASCII, EBCDIC.


Cadena.- es una secuencia finita de smbolos

que se extraen de un alfabeto


Lenguaje.- cualquier conjunto contable de

cadenas sobre un alfabeto.

Cadenas de caracteres (1)


Concatenacin: Sean x y z dos cadenas, la concatenacin xz se forma escribiendo la cadena x seguida de la cadena z. Ejemplo: x = abc, z = deac, xz = abcdeac
La cadena vaca(

concatenacin. s = s = s. x = x = x = abc

) es la identidad en la

Longitud de una cadena: Nmero de caracteres que la forman. Ejemplo: |x| = 3

Cadenas de caracteres(2)
La exponenciacin definida como el producto de cadenas es igual a:
s^0 = s^i = (s^i-1) s donde i>0

Ejemplo: Si s= abc
s^0 = s^1 = abc s^2 = abcabc

Cadenas de caracteres(3)
Prefijo de la cadena s es cualquier cadena que se

obtiene al eliminar cero o ms smbolos del final de s. Por ejemplo: ban, banana y son prefijos de banana.
Sufijo de la cadena s es cualquier cadena que se

obtiene al eliminar cero o ms smbolos del principio de s. Por ejemplo: nana, banana y son sufijos de banana

Cadenas de caracteres(4)
Una subcadena de s se obtiene al eliminar cualquier

prefijo y cualquier sufijo de s. Por Ejemplo: banana, nan y son subcadenas de banana.
Los prefijos, sufijos y subcadenas propios de una

cadena s son esos prefijos, sufijos y subcadenas, respectivamente, de s son que no son ni son iguales a ala misma s.

Cadenas de caracteres(5)
Una subsecuencia de s es cualquier cadena que se forma mediante la eliminacin de cero o ms posiciones no necesariamente consecutivas de s.
Por Ejemplo: baan es una subsecuencia de banana.

Ejercicio: de la cadena azul determine:


a) Prefijos, b) Sufijos, c)Prefijos Propios, d)Subcadenas,

e) Subsecuencias

Operaciones aplicadas a lenguajes


Unin, es la operacin familiar que se hace con los conjuntos. Concatenacin, se da cuando se concatenan todas las cadenas que se forman al tomar una cadena del primer lenguaje y una cadena del segundo lenguaje,

en todas las formas posibles.

Operaciones aplicadas a lenguajes


Cerradura de Kleene de un lenguaje L se denota como L*, y es el conjunto de cadenas que se obtienen al concatenar L cero o ms veces.
L^0 = {}
L^i = L^(i-1) L

Cerradura positiva de Kleene denotada como L+ es

igual que la cerradura de Kleene pero sin el termino L^0

Operaciones aplicadas a lenguajes.Definicin


Operacin Unin de L y M Concatenacin de L y M Cerradura de Kleene de L Cerradura positiva de L Definicin y notacin L U M = {s | s esta en L s esta en M} LM = {st | s esta en L y t esta en M}

Operaciones aplicadas a Lenguajes.Ejercicios


Sea L el conjunto de letras {A,B,...,Z,a,b,...z} y sea D el conjunto de dgitos {0,1,...9}. Podemos pensar en L y D de dos formas equivalentes:
L y D son, respectivamente los alfabetos de las letras

maysculas y minsculas, y de los dgitos.

L y D son lenguajes cuyas cadenas tienen longitud uno.

A continuacin se muestran otros lenguajes que pueden

construirse a partir de los lenguajes L y D, mediante los operaciones antes mencionadas:

Operaciones aplicadas a Lenguajes.Ejercicios


LUD LD L^4
Conjunto de letras y dgitos, 62 cadenas de longitud uno Conjunto de 520 cadenas de longitud 2, cada cadena compuesta por una letra seguida de un digito Conjunto de todas las cadena de 4 letras Conjunto de todas las cadenas de letras, incluyendo la cadena vaca Conjunto de todas las cadenas de letras y dgitos que empiezan con una letra.

L*
L(L U D)* D+

Conjunto de todas las cadenas de uno o ms dgitos

Expresiones Regulares
Expresin regular, es una notacin que permite describir todos los lenguajes que puedan construirse a partir de estos operadores (unin, concatenacin y cerraduras) aplicados a los smbolos de cierto alfabeto.

Una expresin regular es una expresin que describe un conjunto de cadenas sin enumerar sus elementos.

Expresiones Regulares.- Ejemplo


Notacin letra_ Representa a cualquier letra o al guin bajo Notacin dgitos Representa a cualquier dgito

letra_(letra_ | dgitos)*
Representa los identificadores en lenguaje C
Donde
| significa unin * Significa 0 o ms ocurrencias de () agrupan subexpresiones letra_ con el resto de la expresin indica concatenacin

Expresiones Regulares.- Reglas Base


Las expresiones regulares se construyen en forma recursiva a partir de otras expresiones regulares ms pequeas. Cada expresin regular r denota un lenguaje L(r), el cual se forma a partir de los lenguajes denotados por las subexpresiones de r.

Si es una expresin regular entonces L() = {}, es decir el lenguaje cuyo miembro es la cadena vaca. Si a es un smbolo en , entonces a es una expresin regular, y Reglas Base: L(a)= {a}, es decir lenguaje con una cadena, de longitud uno, con a en su nica posicin

Expresiones Regulares.- Induccin


Suponga que r y s son expresiones regulares que denotan a

los lenguajes L(r) y L(s) respectivamente, entonces:


(r)|(s) (r)(s) es una expresin regular que designa a L(r) U L(s) es una expresin regular que designa a L(r)L(s)

(r)*
(r)

es una expresin regular que designa a (L(r))*


es una expresin regular que designa a L(r)

Expresiones Regulares.- Convenciones

Al eliminar parntesis en las expresiones regulares hay que tener en cuenta lo siguiente:
El operador unario * tienen la precedencia ms alta y es asociativo a la izquierda La concatenacin tiene la segunda precedencia ms alta y es asociativa a la izquierda | tiene la precedencia ms basa y es asociativo a la izquierda

Ejemplo

(a)|((b)*(c)) -> a|b*c


Ambas expresiones denotan el conjunto de cadenas que son una sola a seguida de o cero o ms bs seguidas por una c

Expresiones Regulares.Ejemplos: sea = {a,b}


a|b denota el lenguaje {a,b}

(a|b)(a|b)

denota a {aa,ab,ba,bb} el conjunto de cadenas de longitud 2 sobre el alfabeto . Una expresin regular equivalente sera aa|ab|ba|bb

a*

denota el lenguaje que consiste en todas las cadenas de cero mas as es decir {,a,aa,aaa...}

Expresiones Regulares.Ejemplos: sea = {a,b}


denota el conjunto de todas las cadenas que consisten en cero o ms instancias de a o b es decir todas las cadenas de as y bs {,a,b,aa,ab,ba,aaa,....}. Una expresin regular para el mismo lenguaje seria (a*b*)*

(a|b)*

a|a*b

denota el lenguaje {a,b,ab,aab,aaab,...} es decir, la cadena a y todas las cadenas que consisten en cero mas as y que terminan en b

Conjuntos Regulares
A un lenguaje que puede definirse mediante una

expresin regular se lo llama conjunto regular


Si dos expresiones regulares r y s denotan el mismo

conjunto regular, decimos que son equivalentes y podemos escribir r = s. Ejemplo (a|b) = (b|a)

Expresiones Regulares.Leyes Algebraicas


r|s = s|r r|(s|t) = (r|s)|t r(st) = (rs)t r(s|t) = rs|rt r=r =r r* = (r| )* r** = r* | es conmutativo | es asociativo La concatenacin es asociativa La concatenacin se distribuye sobre | es la identidad para la concatenacin se garantiza en una cerradura * Es dem potente

Definiciones Regulares.- Definicin


Si es un alfabeto de smbolos bsicos, entonces la definicin regular es una secuencia de definiciones de la forma:
d1 r1 d2 r2 ... dn rn Donde cada di es un nombre distinto y ri es una expresin regular sobre el alfabeto U { d1,d2,...,di-1 }.

Por conveniencia de notacin, tal vez sea conveniente poner nombre a ciertas expresiones regulares, y utilizarlos en las expresiones subsiguientes, como si los nombres fueran smbolos por si mismos.

Definiciones Regulares.- Ejemplos


Definicin regular para los identificadores de C
letra_ digito Id A | B | ... | Z | a | b | ... | z | _ 0 | 1 | ... | 9 letra_(letra_ | digito)*

Los nmeros sin signos (5280, 0.01234)


digito digitos 0 | 1 | ... | 9 digito digitos*

fraccionOpcional
numero

. digitos |
digitos fraccionOpcional exponenteOpcional

exponenteOpcional ( E (+|-|) digitos) |

Expresiones Regulares.- Extensiones


Una o mas instancias. El operador unario postfijo + representa la cerradura positiva de una expresin regular y su lenguaje. Si r es una expresin regular entonces (r)+ denota el lenguaje (L(r))+. El operador + tiene la misma precedencia y asociatividad que el operador * Cero o una instancia. El operador unario postfijo ? Significa cero o una ocurrencia. Es decir r? es equivalente a r| o dicho de otra forma L(r?) =L(r) U {e}. El operador ? Tiene la misma precedencia y asociatividad que * y + Clases de caracteres. Una expresin regular a1|a2|...|an, en donde ai son cada una de los smbolos del alfabeto, puede sustituirse por [a1a2...an]. Y si a1,a2,..,an forman una secuencia lgica, de letras o nmeros consecutivos, podemos substituirlos por a1-an.

Definiciones Regulares
Definicin regular para los identificadores de C
letra_ digito Id [A-Za-z_] [0-9] letra_(letra_ | digito)*

Los nmeros sin signos (5280, 0.01234)


digito [0-9]

digitos
Numero

digito+
digitos (. Digitos)? (E [+-]? Digitos)?

Reconocimiento de Tokens
Gramtica simple para las instrucciones de bifurcacin y

expresiones condicionales.

instr

If expr then instr \ If expr then instr else instr \

expr term

term oprel term \ term


Id | numero

Reconocimiento de Tokens
Patrones para los tokens del ejemplo anterior
digito dgitos numero letra id If [0-9] digito+ digitos (. digitos)? (E [+-]? digitos)? [A-Za-z_] letra_(letra_ | digito)* If

Then
Else oprel ws

Then
Else < | > | <= | >= | = | <> (blanco | tab | nuevalinea)+

Reconocimiento de Tokens
Lexemas
Cualquier ws If Then If Then

Nombre Token
-

Valor del Atributo


-

Else
Cualquier Id Cualquier nmero < <= = <> > >=

Else
Id Numero Oprel Oprel Oprel Oprel Oprel Oprel

Apuntador a una entrada en la tabla Apuntador a una entrada en la tabla LT LE EQ NE GT GE

Diagramas de transicin de estados


Son el paso intermedio para la construccin de un

analizador lxico
Tienen una coleccin de nodos o crculos llamados

estados. El estado representa un condicin que podra ocurrir durante el proceso de explorar la entrada buscando un lexema que coincida con uno o varios patrones.
Las lneas que se dirigen de un estado a otro se llaman

aristas y son etiquetadas mediante un smbolo o conjunto de smbolos.

Diagramas de transicin de estados


Los estados de aceptacin o finales indican que se ha

encontrado un lexema. Se representan mediante un doble circulo.


* me indica que debo retroceder el apuntador de avance una

posicin.
El estado inicial se lo reconoce puesto que es una arista

etiqueta con la palabra inicio

Diagrama de transicin de operadores relacionales

Diagrama de transicin para identificadores y palabras claves

Ejercicios
Diagrama de transicin para nmeros sin signos

Diagrama de transicin para el espacio en blanco

Autmatas Finitos
Los autmatas finitos son reconocedores; solo dicen si

o no en relacin a c/posible cadena de entrada.


Pueden ser de 2 tipos: Autmatas finitos no deterministas Autmatas finitos determinista

Autmatas finitos no deterministas (AFN)


Es un modelo matemtico formado por : Un conjunto de Estados S Un conjunto de smbolos de entrada , el alfabeto de entrada Una funcin de transicin que proporciona, para c/estado y para cada smbolo en U {}, un conjunto de estados siguientes. Un estado So que se considera el estado inicial Un conjunto de estados F, un subconjunto de S, considerados como estados de aceptacin o finales

AFN

Grafo de transiciones de un AFN que reconoce el lenguaje de la expresin regular (a|b)*abb

Un AFN acepta una cadena de entrada x si y solo si hay algn camino en el grafo de transiciones desde el estado inicial a algn estado de aceptacin. Ser aceptada la cadena aabb?

AFN Tablas de transicin

Smbolos de Entrada

Estado 0 1 2 3

a {0,1} -

b {0} {2} {3} -

AFN - Ejemplo

El grafo reconoce aa*|bb*. La cadena aaa es

reconocida recorriendo los estados 0,1,2,2,2. Las etiquetas de las arista son ,a,a,a cuya concatenacin es aaa.

Construccin de un AFN desde una expresin regular


AFN para

AFN para a de un

Construccin de un AFN desde una expresin regular


Supngase que N(s) y N(t) son AFN para las expresiones

regulares s y t: Para la expresin regular s|t, constryase el siguiente AFN compuesto N(s|t)

Construccin de un AFN desde una expresin regular


Supngase que N(s) y N(t) son AFN para las expresiones

regulares s y t: Para la expresin regular st, constryase el AFN compuesto de N(st)

Construccin de un AFN desde una expresin regular


Supngase que N(s) y N(t) son AFN para las expresiones

regulares s y t: Para la expresin regular s*, constryase el AFN compuesto N(s*)

AFN que acepta (a|b)*abb

Construccin de un AFN desde una expresin regular


rbol sintctico para r = (a|b)*abb

Glosario.- Expresin
En

programacin, una expresin es una combinacin de constantes, variables o funciones, que es interpretada (evaluada) de acuerdo a las normas particulares de precedencia y asociacin para un lenguaje de programacin en particular.

Ejemplos de expresiones
Expresin aritmtica: 3+2, x+1, ...

Expresin lgica: x OR y, NOT x, ...


Expresin con predicados: P(a) AND Q(b)

Autmatas Finitos Deterministas (AFD)


Es un caso especial de AFN en el cual: Ningn estado tiene la transicin , es decir una transicin de entrada .
Para c/estado s y cada smbolo de entrada a, hay a lo sumo

una arista etiquetada a que sale de s

Autmatas Finitos Deterministas (AFD)


La cadena de entrada ababb que se puede obtener de la

expresin regular (a|b)*abb es aceptada por el siguiente grafo de transiciones AFD ?

Conversin de una AFN a una AFD

AFN que acepta (a|b)*abb

Conversin de una AFN a una AFD Algoritmo


Construye una tabla de transiciones tranD para D. Cada estado del AFD es

un conjunto de estados del AFN y se construye tranD de modo que D simular en paralelo todos los posibles movimientos que N puede realizar con una determinada cadena de entrada Operacin
Cerradura- (s)

Descripcin
Conjunto de estados del AFN a los que se puede llegar desde el estado s del AFN, slo en las transiciones

Cerradura- (T)
Mover(T,a)

Conjunto de estados de AFN alcanzables desde algn estado s en T con transiciones solamente
Conjunto de estados del AFN hacia los cuales hay una transicin con el smbolo de entrada a desde algn estado s en T del AFN

Conversin de una AFN a una AFD


Cerradura- (0) Cerradura- (Mover(A,a)) A = {0,1,2,4,7} Cerradura- (Mover({0,1,2,4,7},a)) Cerradura- (3,8) = {1,2,3,4,6,7,8} = B tranD[A,a] = B Cerradura- (Mover({0,1,2,4,7},b)) Cerradura- (5) = {1,2,4,5,6,7} = C tranD[A,b] = C Cerradura- (Mover({1,2,3,4,6,7,8},a)) Cerradura- (3,8) = {1,2,4,5,6,7,8} = B tranD[B,a] = B

Cerradura- (Mover(A,b))

Cerradura- (Mover(B,a))

Cerradura- (Mover(B,b))

Cerradura- (Mover({1,2,3,4,6,7,8},b)) Cerradura- (5,9) = {1,2,4,5,6,7,9} = D tranD[B,b] = D

Conversin de una AFN a una AFD


Cerradura- (Mover(C,a)) Cerradura- (Mover({1,2,4,5,6,7},a)) Cerradura- (3,8) = {1,2,3,4,6,7,8} = B tranD[C,a] = B Cerradura- (Mover ({1,2,4,5,6,7},b)) Cerradura- (5) = {1,2,4,5,6,7} = C tranD[C,b] = C Cerradura- (Mover({1,2,4,5,6,7,9} a)) Cerradura- (3,8) = {1,2,3,4,6,7,8} = B tranD[D,a] = B Cerradura- (Mover ({1,2,4,5,6,7,9} ,b)) Cerradura- (5,9,10) = {1,2,4,5,6,7,9,10} = E tranD[D,b] = E

Cerradura- (Mover(C,b))

Cerradura- (Mover(D,a))

Cerradura- (Mover(D,b))

Conversin de una AFN a una AFD


Cerradura- (Mover(E,a)) Cerradura- (Mover({1,2,4,5,6,7,9,10},a)) Cerradura- (3,8) = {1,2,3,4,6,7,8} = B tranD[E,a] = B Cerradura- (Mover ({1,2,4,5,6,7,9,10},b)) Cerradura- (5) = {1,2,4,5,6,7} = C tranD[E,b] = C D = {1,2,4,5,6,7,9} E = {1,2,4,5,6,7,10}

Cerradura- (Mover(E,b))

A={0,1,2,4,7} B={1,2,3,4,6,7,8} C={1,2,4,5,6,7}

Conversin de una AFN a una AFD

You might also like