UNIDAD 2. EXPRESIONES REGULARES LENGUAJES Y AUTOMATAS AUTOMATAS ISC. ROSA IMELDA GARCIA CHI, MTI
EXPRESIONES REGULARES Las expresiones regulares permiten denotar lenguajes regulares y su estudio resulta de gran interés, tanto por su capacidad de especificación mediante un número reducido de operadores
como por sus aplicaciones prácticas en la construcción de analizadores léxicos.
Definición: Dado el alfabeto , una expresión regular será el resultado de la aplicación de algunas (o todas) de las siguientes reglas un número finito de veces:
1. El símbolo Ø es una expresión regular y denota el lenguaje vacío, 2. El símbolo ε es una expresión regular y denota el lenguaje {ε}, 3. Si a entonces a es una expresión regular que denota el
lenguaje {a}, 4. Si y son expresiones regulares entonces a) + es una expresión regular que denota la unión de los lenguajes denotados por y por . b) es una expresión regular que denota la concatenación del lenguaje denotado por con el denotado por . c) * es una expresión regular que denota la clausura del lenguaje denotado por .
Teoremas para Expresiones Regulares
De Expresiones Regulares a
Lenguajes Regulares
DEFINICIÓN FORMAL DE
LENGUAJE REGULAR
EXPRESIONES REGULARES
SIGNIFICADO DE LAS
EXPRESIONES REGULARES
Grupos viernes
Ejemplo
En el ejemplo podemos observar como se eliminan las comillas y el ●
Ejemplo: Encontrar una expresión regular para el lenguaje en {a,b}* en el que inmediatamente antes de toda b aparece una a Solución: Una posible ER es (a+ ab)*
Una solución aceptable para este tipo de problemas debe cumplir dos caracterísitcas
Corrección
Completez
corrección
Las palabras que represente la ER propuesta deben satisfacer la descripción del problema (por ejemplo, para el problema del ejemplo, la solución a*(a+b)* no es adecuada porque representa algunas palabras, como abb, que no satisfacen la condición de que toda b esté inmediatamente precedida por una a;
Completez
La ER propuesta debe representar todas las palabras que satisfagan la condición. Así para el problema del ejemplo, la solución (ab)* no es adecuada porque hay palabas tales como aab, pertenecientes al lenguaje, que no son representadas por dicha ER
METODOLOGÍA DE DISEÑO DE LAS EXPRESIONES REGULARES
Al tratar de encontrar una ER para un lenguaje dado, mientras más complejo sea el lenguaje es obvio que resulta más difícil encontrar por pura intuición dicha ER. En estos casos puede ser conveniente trabajar en forma metódica. Una técnica que funciona en muchos casos consiste en determinar primero la estructura de la ER, dejando unos «huecos» pendientes para resolverse luego. Estos huecos, que llamaremos contextos, son también lenguajes para los que habrá que encontrar una ER
Un importante elemento de metodología – que se aplicó en este ejemplo- consiste en transformar los enunciados de lenguajes de manera que sean más fácilmente representables por ER En particular, los enunciados «negativos» del tipo «…las palabras que no contengan bb» son
particularmente difíciles, porque en las ER no hay ningún operador para representar «lo que no forma parte del lenguaje», sino que los operadores (como la unión o la estrella de Kleene) tienden a añadir más palabras En consecuencia, es necesario convertir un enunciado sobre lo que no se permite en otro enunciado sobre lo que sí se permite.
Por ejemplo, si en un lenguaje las palabras no deben contener la cadena «bb» ¿qué es lo que sí puede contener?
Aquí podemos hacer un análisis por casos, considerando que podemos tener una b sola, o también una b seguida de una a.
Como hay dos casos podemos pensar en utilizar el operador «+» para combinar esos casos, y así en adelante
OPERACIONES CON
LENGUAJES REGULARES
OPERACIONES CON
EXPRESIONES REGULARES
PRECEDENCIA DE LAS OPERACIONES
EXPRESIONES REGULARES
TEOREMA
PROPIEDADES
EJEMPLOS
EQUIVALENCIA ENTRE EXPRESIONES REGULARES
EQUIVALENCIAS
Ejercicios
SOLUCIÓN
EJERCICIOS
SOLUCIÓN
EXPRESIONES REGULARES
ESPECIFICACIÓN DE CATEGORÍAS LÉXICAS
EJEMPLOS
DE EXPRESION REGULAR A LENGUAJE REGULAR
ABREVIATURAS DE LAS
EXPRESIONES REGULARES EXTENDIDAS
EJEMPLOS
Expresiones regulares y lenguajes obtenidos del libro de «Lenguajes Formales y Teoría de la computación» de John Martin
Ejemplos
EJEMPLOS LENGUAJE
L{ε} L{} L{} L{0} L{001} o sea L{0}{0}{1} L{0,1} o sea {0}{1} L{0,10} osea {0}{10}
EXPRESION REGULAR CORRESPONDIENTE ε
0 001 0+1 0+10
EJEMPLOS LENGUAJE
L{1,ε}{001} L{1,} {001} L{1,} {001} L{110}*(0,1) L{1}*{10} L{10,111,11010}* L{0,10}*({11}*{001, ε})
EXPRESION REGULAR CORRESPONDIENTE (1+ε)001 (1+)001 (1+)001
(110)*(0+1) 1*10 (10+111+11010)* (0+10)*((11)*+(001+ ε))
Se piensa en EXPRESIÓN REGULAR como representativa de la «cadena más característica» del lenguaje respectivo. Por ejemplo: 1*10 es una cadena consistente en la subcadena 10 precedida de cualquier número de unos. Ejemplos: 110, 1110, 11110,111110,...
Ejemplo: cadenas de longitud par Sea L {0,1}* el lenguaje de todas las cadenas de longitud par. Puesto que 0 es par, εL ¿Es L regular? R= Si lo es ¿cuál es la Expresión Regular que le corresponde? R= Todas las cadenas de longitud par pueden obtenerse al concatenar cero o más cadenas de longitud 2. A la inversa, toda concatenación de este tipo tiene longitud par. De ello, se sigue que: L={00,01,10,11}* De modo que una expresión regular correspondiente a L es (00+01+10+11)* Otra sería (0+1)(0+1)*
Ejemplo: cadenas con números non de 1’ss Sea L el lenguaje de todas las cadenas 0´ s y 1’s que contiene un número par de 1´s. Toda cadena de l debe tener por lo menos un 1 y, por ende, ha de comenzar con una cadena de la forma 0 i10j Hay un número par (posiblemente cero) de 1´s adicionales, cada uno seguido de cero o más 0´s. Ello significa que el resto de la cadena es la concatenación de cero o más elementos de la forma general 10 m10n Así, una expresión regular que describe a L es: 0*10*(10*10*)*
Otra expresión levemente distinta, que podría obtenerse al interrumpir la subcadena inicial después del 1 sería 0*1(0*10*1)*0* Si se parte de considerar el último 1 de la cadena en lugar del primero, se terminaría con: (0*10*1)*0*10* Una respuesta más complicada y todavía correcta sería: 0*(10*10*)*1(0*10*1)*0*
Lo importante de todos estos ejemplos es que la expresión regular debe ser suficientemente general para describir toda cadena del lenguaje. Una expresión que no funcionaría satisfactoriamente sería: (10*10*)*10* Ya que no permite cadenas que comienzan con 0. Este problema se corregiría al insertar 0* al comienzo, para obtener: 0*(10*10*)*10* Ésta es una forma de mostrar explícitamente el último 1 de la cadena, un tanto diferente de la tercera expresión regular del ejemplo
Ejemplo: cadenas de longitud 6 o menos Sea L el conjunto de todas las cadenas en {0,1} de longitud 6 o menos. Una expresión sencilla a la vez que poco elegante, que corresponde a L es: ε+0+1+00+01+10+11+000+001+…+111+…+000000+…+111111
Una expresión regular para describir el conjunto de cadenas cuya longitud sea precisamente seis, sería: (0+1)(0+1) (0+1)(0+1) (0+1)(0+1) O en la notación extendida (0+1) 6 Sin embargo para reducir la longitud podría permitirse simplemente algunos o todos los factores sean ε. Así pues, podría describirse L con la expresión regular: (0+1+ ε) 6
Ejemplo: cadenas que terminan con 1 y no contienen 00 En esta ocasión sea L el lenguaje siguiente:
L={x{0,1}* x termina con 1 y no contiene la subcadena 00}
A fin de encontrar una expresión regular para L, se intenta describir de otras maneras la propiedad definitoria de las cadenas de L Afirmar que una cadena no contiene la subcadena 00 equivale a decir que ningún 0 puede ir seguido de otro 0, en otras palabras, que cada 0 aparece al final de la cadena o va seguido inmediatamente de 1
Puesto que las cadenas de L no pueden tener 0 al final, cada 0 debe ir seguido de 1 Ello implica que la cadena entera consiste en copias de las cadenas 01 y 1, por lo que cada cadena de L corresponde a la expresión regular: (1+01)* Sin embargo, esta expresión regular es demasiado general, ya que permite la inclusión de la cadena nula (o vacía) La definición afirma que las cadenas de l deben terminar con 1, lo cual es más fuerte que decir que no pueden terminar con 0. El problema no se corrige al agregar 1 al final, para obtener (1+01)*1, ya que ahora la expresión no es suficientemente general: no permite la subadena 01 Para posibilitar esta opción, se obtiene: (1+01)*(1+01), o (1+01)+
Ejemplo: El lenguaje de identificadores de C En este ejemplo, resulta útil un poco más de notación. Úsemos temporalmente l (de «letra») para denotar la expresión regular: a+b+c+…+z+A+B+C+…+Z
Y de (de «dígito» ) para respresentar: 0+1+2+3+…+9