Vous êtes sur la page 1sur 49

Anlisis lxico

Ing. Ma. Margarita Labastida Roldn Verano 2013

Contenido
Proceso de Anlisis Lxico Expresiones Regulares Autmatas Finitos Desde las expresiones regulares hasta los DFA

Introduccin
La fase de rastreo, o anlisis lxico, de un compilador tiene la tarea de leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Los tokens son como las palabras de un lenguaje natural: cada token es una secuencia de caracteres que representan unidad de informacin en el programa fuente.
If, while (identificadores) Smbolos aritmticos Smbolos compuestos (>= y <>)

Introduccin (2)
Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de patrones, es necesario estudiar mtodos de especificacin y reconocimiento de patrones. Estos mtodos son expresiones regulares y autmatas finitos.

Proceso del anlisis lxico


El trabajo principal es leer los caracteres del cdigo fuente y formarlos en unidades lgicas para que lo aborden las partes siguientes del compilador. Las unidades lgicas que genera el analizador lxico se denominan tokens, estas forman palabras a partir de caracteres. Los tokens son entidades lgicas que por lo regular se definen como un tipo enumerado:
typedef enum {IF, THEN, ELSE, PLUS, MINUS, NUM, } TokenType;

Proceso del anlisis lxico(2)


Los token caen en diversas categoras, una de ellas la constituyen las palabras reservadas, smbolos especiales, finalmente existen token que pueden representar cadenas de mltiples caracteres. Los tokens como entidades se deben distinguir de las cadenas de caracteres que representan, para esto la cadena representada se denomina en ocasiones valor de cadena o lexema. Algunos tokens tiene slo un lexema: las palabras reservadas tienen esta propiedad.

Los identificadores estn representados por el token ID, pero tienen muchos valores de cadena diferentes que representan sus nombres individuales. Estos nombres estn contenidos en la tabla de smbolos .

Proceso del anlisis lxico(3)


Un analizador lxico tambin debe construir los valores de cadena de algunos tokens. Cualquier valor asociado a un token se denomina atributo del token, y el valor de cadena es un ejemplo de un atributo.
Por ejemplo un token NUM puede tener un atributo de valor de cadena como 32767, calculado a partir de su valor de cadena. En el caso de un token del smbolo MAS, no solo tiene el valor de cadena +, sino tambin la operacin aritmtica real.

Proceso del anlisis lxico(4)


Un analizador lxico necesita calcular tantos atributos de un token como sean para permitir el procesamiento siguiente. El analizador lxico podra utilizar el valor de cadena de un identificador para introducirlo a la tabla de smbolos, o podra pasarlo para introducirlo en una etapa posterior. Puesto que el analizador lxico tendr que calcular varios atributos para cada token, es til recolectar todos los atributos en un solo tipo de datos estructurados, denominado registro de token.

Proceso del anlisis lxico(5)


Un registro as se podra declara en C como: El analizador lxico solamente devuelva el valor del token y coloca los otros atributos en variables donde se pueda tener acceso a ellos por otras partes del compilador. El analizador lxico funciona bajo el control del analizador sintctico, devolviendo el siguiente token simple desde la entrada bajo la demanda mediante una funcin:

O como una unin

Proceso del anlisis lxico(6)


La funcin getToken declarada de esta manera devolver, cuando se le llame, siguiente token desde la entrada, y adems calcular atributos adicionales, como el valor de cadena del token. La cadena de caracteres de entrada por lo regular no tiene un parmetro para esta funcin, pero se conserva en un buffer.

Ejemplo: a[index]= 4 + 2 Esta lnea de cdigo se almacena en un buffer de entrada, con el siguiente carcter de entrada indicado por la flecha:

Una llamada a getToken necesita saltarse los siguientes cuatro espacios en blanco, reconocer la cadena a compuesta del carcter nico a como el token siguiente, y devolver el valor de token ID como el token siguiente, dejando el buffer de entrada:

De esta manera, una llamada posterior comenzar de nuevo el proceso de reconocimiento con el carcter de corchete izquierdo.

Expresiones Regulares
Representan patrones de cadenas de caracteres. Una expresin regular r se encuentra completamente definida mediante el conjunto de cadenas con las que concuerda. Este conjunto se denomina lenguaje generado por la expresin regular y se escribe como L(r). El lenguaje depende, del conjunto de caracteres que se encuentran disponible (ASCII), el conjunto ser ms general que el de caracteres, en cuyo caso los elementos del conjunto se describen como smbolos, (conocido como alfabeto) y por lo general se representa mediante .

Expresiones Regulares(2)
Una expresin regular r tambin contiene caracteres del alfabeto, pero tienen significado diferente: en una expresin regular todos los smbolos indican patrones. Una expresin regular r puede contener caracteres que tengan significados especiales (metacaracteres o metasmbolos)

Definicin de expresiones regulares


Expresiones regulares bsicas: Son los caracteres simples del alfabeto, los cuales se corresponden a s mismos. Dado cualquier carcter a del alfabeto , la expresin regular a corresponde al carcter a escribiendo L(a) = {a}.
Un smbolo que indica una concordancia con la cadena vaca, se utiliza el smbolo para denotar la cadena vaca establecido L() ={} Un smbolo ms que corresponde a la ausencia de cadenas, cuyo lenguaje sea el conjunto vaco, escrito como { }, se utiliza y se denota L() = { }.

Definicin de expresiones regulares(2)


Operaciones de expresiones regulares. Existen tres operaciones bsicas en las expresiones regulares:
Seleccin entre alternativas, la cual se indica mediante el metacarcter | Concatenacin, que se indica mediante yuxtaposicin (sin un metacarcter) Repeticin o cerradura, la cual se indica mediante el metaccter *.

Operaciones de expresiones regulares


Seleccin entre alternativas. Si r y s son expresiones regulares, entonces r|s es una expresin regular que define cualquier cadena que concuerda con r o con s. El lenguaje r|s es la unin de los lenguajes de r y s, o L(r|s) = L(r) L(s).
Considere la expresin regular a|b: corresponde tanto al carcter a como al carcter b, L(a|b)=L(a)L(b)={a} {b} = {a,b}. La seleccin se puede extender a ms de una alternativa, L(a|b|c|d) ={a,b,c,d}

Operaciones de expresiones regulares(2)


Concatenacin. La concatenacin de dos expresiones regulares r y s se escribe como rs, y corresponde a cualquier cadena que sea la concatenacin de dos cadenas, con la primera de ellas correspondiendo a r y la segunda correspondiendo a s.
Por ejemplo: la expresin regular ab corresponde slo a la cadena ab, mientras que la expresin regular (a|b)c corresponde a las cadenas ac y bc.

Operaciones de expresiones regulares(3)

Dados dos conjuntos de cadenas S1 y S2, el conjunto concatenado de cadenas S1S2 es el conjunto de cadenas de S1 complementado con todas las cadenas de S2. Si S1={aa,b} y S2={a,bb}, entonces S1S2={aaa,aabb,ba,bbb}. La operacin de concatenacin para expresiones regulares se puede definir como L(rs)=L(r)L(s). La concatenacin se puede extender a ms de dos expresiones regulares: L(r1,r2,rn)=L(r1)L(r2)L(rn)=el conjunto de cadenas formado al concatenar todas las cadenas de cada una de las L(r1),,L(rn)

Operaciones de expresiones regulares(4)


Repeticin. Denominada tambin como cerradura, se escribe r*, donde r es una expresin regular. La expresin regular r* corresponde a cualquier concatenacin finita de cadenas, cada una de las cuales corresponde a r. Por ejemplo a* corresponde a las cadenas , a, aa, aaa, Se puede definir la operacin de repeticin en trminos de lenguajes generados definiendo, una operacin similar * para conjuntos de cadenas. Dado un conjunto S de cadenas, sea: Esta es una unin de conjuntos infinita, pero cada uno de sus elementos es una concatenacin finita de cadenas de S. Descrito: donde = S,.. S es la concatenacin de S por n veces

Operaciones de expresiones regulares(5)


Una vez analizado se define la operacin de repeticin para expresiones regulares como:

Considere la expresin (a|bb)*, corresponde a cualquiera de las cadenas siguientes: , a, bb, aa, abb, bba, bbbb, aaa, aabb y sucesivamente. En trminos de lenguajes, L((a|bb)*)=L(a|bb)*={a,bb}*={, a, bb, aa, abb, bba,}

Operaciones de expresiones regulares(6)


Precedencia de operaciones y el uso de los parntesis. La descripcin precedente no toma en cuenta la cuestin de la precedencia de las operaciones de eleccin, concatenacin y repeticin. Dada la expresin regular a|b*, se puede interpretar como (a|b)* o como a|(b*) que difieren en demasa: L((a|b)*)={, a, b, aa, ab, ba, bb,} mientras que L(a|(b*))={, a, b, bb, bbb, }. La convencin estndar es que la repeticin debera tener mayor precedencia, por lo que la segunda interpretacin es la correcta.

Operaciones de expresiones regulares(7)


Entre las tres operaciones, se le da al * la precedencia ms alta, a la concatenacin se le da la precedencia que sigue y a la | se le otorga la precedencia ms baja. De esta forma a|bc* se interpreta como a|(b(c*)), mientras que ab|c*d se interpreta como (ab)|((c*)d). Los parntesis aqu se usan igual que en aritmtica, pero el * tiene precedencia ms alta que +.

Operaciones de expresiones regulares(8)


Nombres para expresiones regulares. Es til como una forma de simplificar la notacin proporcionar un nombre para una expresin regular larga, de modo que no se escriba la misma expresin. Si se desea desarrollar una expresin regular para una secuencia de uno o ms dgitos numricos:
(0|1|2| 9) (0|1|2||9)*

o se podra escribir donde


dgito dgito* dgito = 0|1|2||9

es una definicin regular del nombre dgito.

Operaciones de expresiones regulares(9)


El uso de una definicin regular es muy conveniente, pero introduce la compilacin agregada de que el nombre mismo se convierta en un metasmbolo y se deba encontrar un significado para distinguirlo de la concatenacin de sus caracteres.

Expresin regular (definicin)


Una expresin regular es una de las siguientes:
Una expresin regular bsica constituida por un solo carcter a, donde a proviene de un alfabeto de caracteres legales; el metacarcter ; o el metacarcter . En el primer caso, L(a) = {a}; en el segundo L()={}; en el tercero L()={ }. Una expresin de la forma r|s, donde r y s son expresiones regulares. En este caso, L(r|s)=L(r)L(s). Una expresin de la forma rs, donde r y s son expresiones regulares. En este caso L(rs)=L(r)L(s).

Expresin regular (definicin)


Una expresin de la forma r*, donde r es una expresin regular. En este caso, L(r*)=L(r)*. Una expresin de la forma (r), donde r es una expresin regular. En este caso, L((r))=L(r). De este modo, los parntesis no cambian el lenguaje, slo se utilizan para ajustar la precedencia de las operaciones.
En cuanto a la precedencia: | tiene precedencia ms baja que la concatenacin, y sta tiene una precedencia ms baja que el *.

Ejemplo 1
Consideremos el alfabeto simple constituido por slo tres caracteres alfabticos:={a,b,c}. Tambin el conjunto de todas las cadenas en este alfabeto que contengan exactamente una b. Este conjunto es generado por la expresin regular (a|c)*b(a|c)*
Aunque b aparece en el centro de la expresin regular, la letra b no necesita estar en el centro de la cadena que se desea definir. La repeticin de a o c antes y despus de la b puede presentarse en diferentes nmeros de veces. Todas las cadenas siguientes estn generadas mediante la expresin regular anterior: b, abc, abaca, baaaac, ccbaca, ccccccb

Ejemplo 2
Con el mismo alfabeto que antes, se considera el conjunto de todas las cadenas que contiene como mximo una b. Una expresin regular para este conjunto se puede obtener utilizando la solucin al ejemplo anterior como una alternativa y la expresin regular (a|c)* como la otra alternativa: (a|c)*|(a|c)*b(a|c)* Una solucin alternativa sera permitir que b o la cadena vaca apareciera entre las dos repeticiones de a o c: (a|c)*(b|)(a|c)*

Ejemplo 2
En el ejemplo anterior se plantea que el mismo lenguaje se puede generar mediante muchas expresiones regulares diferentes. Por lo general, se intenta encontrar una expresin regular tan simple como sea posible para describir un conjunto de cadenas.

Ejemplo 3
Considere el conjunto de cadenas S sobre el alfabeto ={a,b} compuesto de una b simple rodeada por el mismo nmero de a: Este conjunto no se puede describir mediante una expresin regular, ya que la nica operacin de repeticin es la de cerradura *, que permite cualquier nmero de repeticiones.
De tal forma que la expresin a*ab* no hay garanta de que el nmero de a antes y despus de la b ser el mismo. Lo anterior se expresa al decir que las expresiones regulares no pueden contar.

Ejemplo 4
Considere las cadenas en el alfabeto ={a,b,c} que no contienen dos b consecutivas. De modo que, entre cualesquiera dos b, debe haber por lo menos una a o una c. Se considera una expresin regular para este conjunto en varia etapas.
Primero se obliga a que una a o una c se presenten despus de cualquier b: (b(a|c))* Se puede combinar esto con la expresin (a|c)*, que define cadenas que no tienen b y se escribe ((a|c)*|(b(a|c))*)* O se considera que (r*|s*)* corresponde con las mismas cadenas que (r|s)*: ((a|c)|(b(a|c)))* o (a|c|ba|bc)*

Ejemplo 4
El lenguaje generado anteriormente tiene la propiedad que no haya dos b consecutivas pero aun no es correcta. Esto se debe a que ninguna cadena generada mediante la expresin regular anterior puede finalizar con una b, esto se corrige agregando una b opcional rezagada: (a|c|ba|bc)*(b|) Tambin se podra generar este mismo lenguaje escribiendo (notb|b notb)*(b|)
Donde notb=a|c
Esta solucin es preferible en los casos en que el alfabeto es grande, ya que notb se puede ajustar para incluir todos los caracteres, excepto b, sin complicar la expresin original.

Ejemplo 5
Se proporciona la expresin regular y se pide determinar una descripcin concisa en espaol del lenguaje que genera. Considere el alfabeto ={a,b,c} y la expresin regular: Esto genera el lenguaje de todas las cadenas que contengan un nmero par de a. Considerando la expresin dentro de la repeticin: Lo anterior genera cadenas que finalizan en a y que contienen exactamente dos a (cualquier nmero de b y de c puede aparecer antes o entre las dos a). La repeticin de estas cadenas da como resultado las cadenas que finalizan en a cuyo nmero es mltiplo de 2. Al aadir la repeticin (b|c)* al final se obtiene el resultado final. Esta expresin regular tambin se podra escribir como: (nota* a nota* a)* nota*
(b|c)*a(b|c)*a ((b|c)*a(b|c)*a)*(b|c)*

Extensiones para las expresiones regulares


Es indispensable el uso de un conjunto de operaciones ms expresivo debido a que el manejo con las tres operaciones bsicas es complicado. Ayudando as a tener una expresin regular para una gama de caracteres y una expresin regular para todos los caracteres.

Una o ms Repeticiones
Dada una expresin regular r, la repeticin de r se describe utilizando la operacin de cerradura estndar, que se escribe r*. Esto permite que r se repita 0 o ms veces. Lo que garantiza que aparece por lo menos una cadena correspondiente a r, y no permite la cadena vaca .
Ejemplo: si se desea definir nmeros binarios, se puede escribir (0|1)*, pero esto tambin coincidir con la cadena vaca , la cual no es un nmero. Se puede escribir (0|1)(0|1)* La representacin anterior se presenta con tanta frecuencia que se desarroll una notacin estndar que utiliza + en lugar de *: r+, que indica una o ms repeticiones de r. La expresin regular para nmeros binarios se escribe (0|1)+

Cualquier carcter
Una situacin comn es la de generar cualquier carcter en el alfabeto. Sin una operacin especial esto requiere que todo carcter en el alfabeto sea enumerado en una alternativa. Un metacarcter tpico para una concordancia de cualquier carcter es el punto . el cual no requiere que el alfabeto se escriba en forma extendida. Con el metacarcter se puede escribir una expresin regular para todas las cadenas que contengan al menos una b : .*b.*

Un intervalo de caracteres
En ocasiones es necesario escribir un intervalo de caracteres como letras o dgitos. Una alternativa es tener una notacin especial para esta situacin, y comn para emplear corchetes y un guin, como en [a-z] para las letras minsculas y [0-9] para los dgitos. Se pueden incluir los intervalos mltiples, de manera que [a-zA-Z] representa todas las letras minsculas y maysculas. Esta notacin se conoce como clases de caracteres.

Cualquier carcter que no est en un conjunto dado

En ocasiones es til excluir un carcter simple del conjunto de caracteres por generar. Lo anterior se logra con un metacarcter para indicar la operacin de negacin (not) o complementaria sobre un conjunto de alternativas.
Ejemplo: la negacin lgica es la tilde ~, y una expresin regular para un carcter en el alfabeto que no sea a como ~a y uno que no sea a, ni b, ni c como: ~(a|b|c). Una alternativa en Lex es el carcter carat ^ , quedando el ejemplo anterior como [^abc]

Subexpresiones opcionales
Existen algunas cadenas que contienen partes opcionales que pueden o no aparecer en cualquier cadena.
Ejemplo: un nmero puede o no tener un signo inicial, tal como + o -. Se puede emplear alternativas para expresar esto como
natural =[0-9]+ naturalconSigno=natural | + natural | - natural

Lo anterior se puede volver voluminoso, y se introduce el metacarcter ? para indicar que las cadenas que coincidan con r son opcionales (o que estn presentes 0 o 1 copias de r)
natural = [0-9]+ naturalconSigno = (+|-)? natural

Tokens
Los tokens de lenguajes de programacin tienden a caer dentro de varias categoras limitadas. Una categora es la de las palabras reservadas, que son cadenas fijas de caracteres alfabticos que tienen un significado especial en el lenguaje. Otra categora se compone de los smbolos especiales, que incluyen operadores aritmticos, de asignacin y de igualdad.

Tokens
Una tercera categora se compone de los identificadores, que por lo general se definen como secuencias de letras y dgitos que comienzan con una letra. Una ltima categora se compone de literales o constantes, que incluyen constantes numricas, literales de cadena y caracteres.

Nmeros
Pueden se slo secuencias de dgitos (naturales, decimales o con exponente). Se pueden escribir definiciones regulares para estos:
nat = [0-9]+ natconSigno = (+|-)? nat nmero = natconSigno(. nat)?(E natconSigno)?

Identificadores y palabras reservadas


Las palabras reservadas son las ms simples de escribir como expresiones regulares: estn representadas por sus secuencias fijas de caracteres.
Una definicin de todas las reservada = if | while | do | .. palabras reservadas sera:

Los identificadores, son cadenas de caracteres que no son fijas. Un identificador deber comenzar con una letra y contener slo letras y dgitos.
Se puede expresar esto en trminos de definiciones regulares: letra = [a-zA-Z] dgito = [0-9] identificador = letra(letra|dgito)*

Comentarios
Los comentarios por lo regular se ignoran durante el proceso del anlisis lxico. Un analizador lxico debe reconocer los comentarios y descartarlos. Por consiguiente, se necesita escribir expresiones regulares para comentarios, aun cuando un analizador lxico puede no tener un token constante explcito (pseudotokens). Suelen ser de formato libre o estar rodeados de delimitadores tales como
/*este es un comentario de C*/

Comentarios
La expresin regular puede quedar expresada: b*(a*~(a|b)b*)*a* Otra complicacin en el reconocimiento de los comentarios es que, en algunos lenguajes los comentarios estn anidados.

Ambigedad, espacios en blanco


Una definicin de lenguaje debe proporcionar reglas de no ambigedad que implicarn cul significado es el conveniente para cada caso especial.
Cuando una cadena puede ser identificador o palabra clave, se prefiere la interpretacin como palabra clave. Cuando una cadena puede ser un token simple o una secuencia de varios tokens, se prefiere la interpretacin del token simple. (principio de la subcadena ms larga)

Ambigedad, espacios en blanco


Los caracteres que son parte no ambigua de otros tokens son delimitadores.
Ejemplo: en la cadena xtemp=ytempx, el signo de = delimita el identificador xtemp porque no aparece como parte de un identificador.

Los espacios en blanco, los retornos de lnea y los caracteres de tabulacin tambin se asumen como delimitadores de token: while x se interpreta como compuesto de dos tokens que representan la palabra reservada while y el identificador de nombre x.
En el caso anterior se define un pseudotoken de espacio en blanco, que slo sirve al analizador lxico de manera interna para distinguir otros tokens. espacioenblanco = (nuevalnea|blanco|tabulacin|comentario)+