Professional Documents
Culture Documents
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.
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 .
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)
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)
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,}
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)*
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.
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)?
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.
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)+