Professional Documents
Culture Documents
L
2
Diferencia
(8) L
1
L
2
Diferencia Simtrica
Tabla No 1. Propiedades de las Cerraduras
Las demostraciones de estas propiedades se dejan como trabajo complementario
del lector. Consideramos que estas demostraciones no son relevantes para los
objetivos de este libro.
Un lenguaje regular puede ser finito o infinito. De acuerdo a las propiedades de
las cerraduras la unin de lenguajes regulares finitos tambin es regular, sin
embargo la unin de lenguajes regulares infinitos no necesariamente regular.
Por ejemplo,
{ } { }
1
1 /
>
= > =
i
i i n n
b a n b a
L
NO es un lenguaje regular, lo cual se puede demostrar por el lema de Bombeo.
Tambin se puede decir que los lenguajes contenidos dentro de un lenguaje
regular no necesariamente son regulares, tambin se puede concluir que un
lenguaje regular puede contener sublenguajes no-regulares, as:
Si
{ } 1 / > = n b a
n n
L
Es un sublenguaje del lenguaje regular a*b* pero L nos regular.
Las propiedades de cerradura permiten concluir, razonando por contradiccin, que
ciertos lenguajes no son regulares. Esto se ilustra en los siguientes ejemplos en
los que se usa el hecho de que los lenguajes L = {a
i
b
i
: i > 0} y L = { a
i
b
i
: i > 1} no
son regulares.
Ejemplo:
L = {a
i
b
j
: i, j > 0, ij} no es regular.
Si lo fuera, a*b* L tambin lo sera, pero
a*b* L = {a
i
b
i
: i > 0}
2.2.4. Homomorfismo
En un mbito general, el homomorfismo, a veces llamado tambin morfismo, se
define como una funcin que es compatible con toda la estructura relevante. Una
nocin ms general de morfismo se estudia abstractamente en la teora de las
categoras, la cual trata de forma abstracta con las estructuras matemticas y sus
relaciones. Por ejemplo, si un objeto consiste en un conjunto X con un orden
menor y el otro objeto consiste en un conjunto Y con orden mayor, entonces debe
valer para la funcin que, si u < v f(u) < f(v).
O, si en estos conjuntos hay definidas operaciones binarias + y *,
respectivamente, entonces debe valer que: f(u + v) = f(u) * f(v). Ejemplos de
morfismo son los homomorfismos de grupos, los homomorfismos de anillo, los
operadores lineales y las funciones continuas, entre otras.
En el contexto de los lenguajes regulares, el homomorfismo se define como una
funcin que trabaja sobre cadenas, esto quiere decir que a cada smbolo que
pertenece a una cadena se le asocia otra cadena por medio de la concatenacin.
Ejemplo:
Sea h: {0, 1}
*
{a, b}
*
definido como h (0) = ab, y h(1) = .
Entonces h (0011) = abab y h (L (10
*
1)) = L ((ab)
*
).
En las temticas anteriores se ha definido el proceso para identificar si un lenguaje
es o no regular, una vez comprendido este proceso se puede determinar que una
de las formas de especificar un lenguaje regular, es mediante expresiones
regulares, tema que se abordar en detalle a continuacin.
2.3 EXPRESIONES REGULARES
Las Expresiones Regulares simplifican la especificacin de un lenguaje regular y
sirven para efectuar representaciones de los patrones.
Los operadores que se utilizan en las expresiones regulares son los siguientes:
Operador Descripcin
.
Concatenacin
|
Unin
*
Cerradura de Klenne
+
Cerradura Positiva
?
Cerradura 0 o 1 caso
(,)
Agrupar
Tabla No 2. Operadores usados en las Expresiones Regulares
# Operador Descripcin
1. ( , ) Parntesis
2. *, + ,? Cerraduras
3. . Concatenacin
4. | Unin (se lee o y representa la unin en los lenguajes regulares).
Tabla No 3. Orden Jerrquico de Evaluacin de los Operadores
2.3.1. Definicin formal de Expresin Regular
1. es una expresin regular.
2. si a pertenece a
| r
3. r | r = r
4 (r . s) . t = r. (s . t)
5 (r | s) | t =r | (s | t)
6. r . (s | t) = r. s | r . t
7. (r | s)t = r. t | s . t
8. (r | s)* = (r* | s*)* = (r*s*)* = (r*s*)* =(r*s)*r* = r*(sr*)*
9. r(sr)* = (rs)*r
10. (r*s)*=
|(r|s)*s
11. (rs*)*=
|r(r|s)*
12. s(r|
)*(r|
)|s = sr*
13. r
+
= r . r* = r*r
14. r* = | r
+
= r
+
|
15.
(r*)
n
= r*
16. (r*)
+
=r*
17. (r*)* = r*
18. (r
+
)* = r*
19. (r
+
)
+
= r
+
20.
r
?
= | r
Todas las propiedades del lenguaje se aplican en las expresiones regulares.
Ejemplo:
= {a, b} Alfabeto
a. b
*
Expresin regular
Primer paso: verificar que cada elemento est en el alfabeto, de ser as es una
expresin regular, de lo contrario NO.
Segundo paso: Verificar que la expresin contenga las operaciones bsicas
(unin, concatenacin y cerraduras).
Habiendo aplicado el primer y segundo paso se puede identificar si es o no una
expresin regular.
Tercer paso: Utilizando la definicin formal de expresin regular se expresan las
expresiones regulares en sus respectivos lenguajes regulares, tal como se aprecia
a continuacin.
L(a).L*(b) cada uno representa un lenguaje, entonces,
L(a).L*(b)={a}.{b}*, luego se desarrolla la cerradura de Kleene de
{b}*={ ,b,bb,bbb,....} concatenado da como resultado
{a}.{b}*= {a, ab, abb, abbb, abbbb,.....}.
Por tanto, este lenguaje regular corresponde a la expresin regular a. b
*
.
Ejemplo:
= {a, b, c} Alfabeto
b
+
a | abc
?
Expresin regular
Habiendo aplicado los dos primeros pasos se puede concluir que efectivamente es
una expresin regular. A continuacin se realiza el tercer paso concerniente a la
aplicacin de la definicin formal de expresin regular.
b
+
a | abc
?
= L
+
(b).L(a) U L(a) L(b) L
?
(c) = L(b)L*(b).L(a) U L(a) L(b) (L(e)U L(c))
cada uno representa su lenguaje unitario.
= {b}{
,
b, bb, bbb, bbbb,} {a} U {a} {b} {e,c}
= {ba,bba,bbba,bbbba,}U{ab}{e,c} concatenando 2
a
parte
= {ba,bba,bbba,bbbba,}U{ab, abc} uniendo resultara
= {ba, bba, bbba, bbbba,, ab, abc }
Se concluye por tanto que este lenguaje regular corresponde a la expresin
Regular b
+
a | abc
?
Ejemplo:
= {a, b, c} Alfabeto
a
*
|b
*
Expresin regular
Habiendo aplicado los dos primeros pasos se puede concluir que efectivamente es
una expresin regular.
a
*
|b
*
= L
*
(a) U L
*
(b)
= (L(a))
*
U (L(b))
*
= {a}
*
U {b}
*
= { ,a,aa,aaa,aaaa,}U{ ,b,bb,bbb,bbbb,}
={ ,a,aa,aaa,aaaa,,b,bb,bbb,bbbb,}
Este lenguaje regular corresponde a la expresin regular.
2.3.3. Simplificacin de expresiones regulares
Para poder simplificar las expresiones es necesario manejar las propiedades de
los lenguajes descritos y demostrados anteriormente, un ejemplo seria:
[b
+
b
*
| (b| )
?
] [(b
*
b
*
)
+
b
?
]=b
*
[b b
*
b
*
| (b| | )] [((b
*
)
2
)
+
b
?
]=b
*
[b(b
*
)
2
| (b| )] [(b
*
)
+
(b| )]=b
*
[bb
*
|(b| )][b
*
b| b
*
)] =b
*
[b
+
|b| ][ b
+
|b
*
] =b
*
[(b
+
| )|b][b
+
|b
*
] =b
*
[b
*
|b][b
+
|b
*
] =b
*
[b
*
][b
*
] =b
*
[b
*
]
2
=b
*
b
*
= b
*
2.3.4. Expresiones regulares y Patrones
Teniendo claro que un patrn es una regla que describe el conjunto de cadenas de
entrada que corresponden a un componente lxico.
Ejemplo: Una variable comienza en letras seguidas de letras y/ dgitos.
De igual manera un ejemplo sencillo para comprender el concepto de patrn es el
siguiente
Por extensin tenemos: a,e,i,o,u
Por comprensin tenemos: las vocales
La descripcin por compresin es lo que corresponde a un patrn.
Otro ejemplo puede ser {0,1,2,3,4,,9} estos nmeros forma los enteros positivos.
A continuacin se definirn expresiones regulares en las cuales el patrn
corresponde de manera particular y exacta a esa expresin.
Nota 1: un patrn es nico, pero se puede escribir de diferentes formas.
Nota 2: el patrn debe ser general para todas las cadenas del lenguaje.
Ejemplo:
Dada la siguiente expresin regular, identifique el patrn.
(a|b)
*
=L
*
(a|b)
= ({a}U{b})
*
= {a,b}
*
={ ,a,b,aa,bb,ab,ba,aaa,abb,aab,aba,baa,bbb,bab,bba...}
Se observa que se pueden formar todas las cadenas con a y b con cualquier
longitud. Es decir, de longitud 2 las posibles cadenas que se pueden formar son
aa,bb,ab,ba y de longitud 3 las cadenas que se pueden formar son
abb,aab,aba,baa,bbb,bab,bba y as sucesivamente. Todas las combinaciones con
las diferentes longitudes estn dados en este lenguaje regular.
Como resultado se obtiene el siguiente patrn, correspondiente a la expresin
regular enunciada: Todas las posibles cadenas que se pueden formar con a y
b.
Ejemplo:
Dada la siguiente expresin regular, identifique el patrn.
a(a|b)
+
=a(a|b)(a|b)*
=L(a)L(a|b) L
+
(a|b)
= {a}({a}U{b}) ({a}U{b})*
= {a}{a,b}{a,b}*
={a}{a,b}{ ,a,b,aa,bb,ab,ba,........}
={a}{a,aa,ab,aaa,abb,aab,aba,.....b,ba,bb,baa,bbb,bab,bba.....}
={aa,aaa,aab,aaaa,aabb,aaab,aaba,...ab,aba,abb,abaa,abbb,abab,abba...}
={aa,ab,aaa,abb,aab,aba,aaaa,aaab,aaba,aabb,abaa,}
Como resultado se obtiene el siguiente patrn, correspondiente a la expresin
regular enunciada: Todas las posibles cadenas que se pueden formar con a y
b con prefijo a y con longitud mayor o igual a 2.
Ejemplo:
Dada la siguiente expresin regular, identifique el patrn.
(a|b|c)
*
=L
*
(a|b|c)
= ({a}U{b} U{c})
*
= {a,b,c}
*
={ ,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc.aaa,aab,aac,aba,abb,abc,aca,acb,acc,}
Es importante tener en cuenta que no es necesario desarrollar el lenguaje del
ejercicio propuesto para poder entender su comportamiento. Este patrn se puede
deducir a partir del patrn de la expresin regular (a|b)*, es decir, cuando existen
varios componentes lxicos operados con | y todos afectados por una cerradura
de Kleene siempre el resultados ser las posibles combinaciones entre los
diferentes componentes lxico.
Como resultado se obtiene el siguiente patrn, correspondiente a la expresin
regular enunciada: Todas las posibles cadenas que se pueden formar con a, b
y c.
Ejemplo:
Dada la siguiente expresin regular, identifique el patrn.
(a|ab)
*
= L
*
(a|ab)
= ({a} U {ab})
*
= (a, ab)
*
= { ,a, ab, aa, aab, aba, abab, aaa, aaab, aaba, aabab, }
Como resultado se obtiene el siguiente patrn, correspondiente a la expresin
regular enunciada: Todas las posibles cadenas que comienzan con a y no
tiene b seguidas.
Ejemplo:
Dada la siguiente expresin regular, identifique el patrn.
(a|b)
*
a(a|b)
= L
*
(a|b)L(a)L(a|b)
= ({a}U{b})
*
{a}({a}U{b})
= ({a,b})
*
{a} ({a,b})
= { ,a,b,aa,ab,ba,bb,....}{a}{a,b}
= {a,aa,ba,aaa,aba,baa,bba,....}{a,b}
= {aa,ab,aaa,aab,baa,bab,aaaa,aaab,abaa,abab..}
Como resultado se obtiene el siguiente patrn, correspondiente a la expresin
regular enunciada: todas las posibles cadenas que se forman con a y b
que tenga como penltimo el smbolo a.
En los casos generales del diseo de un compilador siempre se le entrega al
diseador las reglas que representan a los componentes lxicos, es por eso que la
va patrn- expresin es la direccin real que representa el diseo y especificacin
de esos patrones.
Para desarrollar este tipo de ejercicios no existe un mtodo definido. Todo
consiste en familiarizarse con las expresiones de tal manera que al leer un patrn
se pueda construir intuitivamente la expresin. Para esto, ayuda conocer en qu
consiste cada una de las operaciones bsicas (concatenacin, unin, cerradura de
Klenne, cerradura positiva y cerradura de 1 o 0 casos) y comprender claramente
su funcionamiento, adems de los alcances de combinar estas operaciones.
Ejemplo:
Todas las posibles combinaciones de a, b y c que comiencen con c.
Solucin:
Como tiene que comenzar por c, lo obvio es que una c vaya al inicio concatenada
con cualquier cadena entre a, b, y c y esa es otra expresin en si misma, que tiene
un nmero infinito de combinaciones. La mejor manera de armarlo es con una
cerradura, si fuera +, siempre la c estara acompaada por lo menos de un
carcter haciendo que la longitud de las cadenas formadas sea mnimo dos, as, la
cerradura adecuada sera * porque ella toma un estado de vaco. Las
combinaciones que se pueden formar entre a, b y c viene dado como (a | b | c)* ya
que siempre que existan elementos entre | y se le aplica una cerradura esto
permite realizar todas las combinaciones.
c(a | b | c)*
Nota: es muy importante que el patrn que se proponga sea muy especfico y
comprenda completamente todos los requisitos de la expresin regular.
Ejemplo:
Todas las cadenas que se puedan formar con a y b que tengan una longitud
mayor o igual a 4.
Solucin:
Todas las posibles combinaciones de a y b se construye con la expresin regular
(a|b)
*
; pero con esta expresin no se controla la longitud de las cadenas, para
controlar la longitud de caracteres se debe controlar as: (a|b)
4
esta expresin
asegura exactamente 4 smbolos y si se concatena con (a|b)
*
se tendran
longitudes mayores e iguales a 4, porque con (a|b)
*
se tendran todas las posibles
cadenas que se pueden formar con a y b, de tal manera que la expresin regular
queda de la siguiente forma:
(a|b)
4
(a|b)
*
Note que esta expresin tambin se puede escribir:
(a|b)
+
(a|b)
3
= (a|b)
3
(a|b)
+
= (a|b)*(a|b)
4
El orden en que se coloque la cerradura no influye porque no estamos controlando
ni el comienzo ni el final de las cadenas.
El concepto de expresin regular tiene su aplicacin prctica en las definiciones
regulares, por ello se abordar este tema a continuacin.
2.4 DEFINICIONES REGULARES
Para el abordaje formal de las Definiciones Regulares, en primera instancia se
describe la definicin regular como concepto fundamental en el proceso del
anlisis lxico y se complementa esto con la construccin de definiciones
regulares a partir de un patrn.
2.4.1. La definicin regular como concepto fundamental en el proceso del
anlisis lxico
La definicin regular permite construir expresiones regulares a partir de patrones,
los cuales poseen muchos componentes y por ende alfabetos con gran cantidad
de smbolos, es decir las definiciones regulares permiten simplificar la cantidad de
expresiones regulares utilizadas para resolver reglas que son aplicadas dentro del
contexto de los lenguajes de programacin y sobre todas aquellas estructuras que
tiene una secuencia susceptibles de ser solucionadas con el concepto de
expresiones regulares.
Definicin formal
Sea un alfabeto, entonces una definicin regular es una secuencia de
definiciones de la forma:
d
1
r
1
donde di y ri son smbolos de U {d1, d2, ....}
d
2
r
2
: :
d
n
r
n
d
n
: Son las definiciones regulares las cuales son nombres dados por el diseador,
que los asigna de acuerdo a las caractersticas o la funcin que tiene dentro del
diseo. Estas deficiones pueden estar formadas por otras definiciones
previamente definidas.
r
i
: son expresiones regulares que provienen de un alfabeto.
: la flecha se lee como define produce.
d
n
r
n
: d
n
se define como r
n
dn produce r
n
La estructura que debe contener una definicin regular completa es la siguiente:
1. Identificacin de los alfabetos.
1
= {0,1,2,3,5,6,7,8,9}
2
= {+,-}
3
= {.,,}
2. Determinacin de las definiciones bsicas. Es decir construccin de las
definiciones regulares a partir de las expresiones regulares bsicas
tomadas de los alfabetos.
dig [0-9]
signo +|-
sep .|,
3. Determinacin de definiciones compuestas (que se forman de otras
definiciones).
Numero_entero signo dig
+
Numero_decimal signo dig* sep sig
+
4. Definicin resultante (esta definicin contiene la solucin del problema)
Nmero numero_entero | numero_decimal.
Esta definicin genera dos opciones, es decir las dos posibilidades de
nmeros enteros y decimales
2.4.2. Construccin de definiciones regulares a partir de un patrn
Ejemplo:
Una variable debe empezar con una letra y los caracteres siguientes deben ser
letras y/o dgitos.
Solucin:
Lo primero es definir los alfabetos que nos servirn para desarrollar la definicin
regular, es importante que se tenga en cuenta que los alfabetos deben estar
definidos por su tipo, es decir, un alfabeto para las letras, otro para los nmeros y
otro para los signos.
1 = {a, b, c,..., z, A, B, C,..., Z}
2 = {0, 1, 2,..., 9}
Se necesita en este patrn las letras y los dgitos
Letra [ a | b | c || z | A | B | C |...| Z]
Se puede simplificar de la siguiente forma:
[a-z, A-Z] es una forma de representar
Se necesita definir los dgitos
digito 0 | 1 | 2 | . | 9 | dgito [ 0-9 ]
Ahora la definicin regular var comienza con una letra y como el enunciado del
ejercicio especifica que debe ir seguido por letras y/o dgitos, esto se puede
representar con una operacin de concatenacin de la definicin bsica letra con
las posibles combinaciones que se pueden dar entre letra y dgitos, la definicin
quedara de esta manera:
var Letra (Letra | digto)*
Ejemplo:
Los nmeros pueden ser casificados como enteros, decimales y punto flotante.
Construya una definicin regular para determinar el nmero que corresponde.
Solucin:
1
= {0,1,2,....,9}
2
= {+,-}
3
= {.}
4
= {E,e}
digto [0 - 9]
sig (+|-)
Exp(E|e)
Ent sig? Digto
+
Dec Sig
?
digito*.digito
+
Flotante Sig
?
(Ent | Dec)(Exp) Ent
Ejemplo:
Un identificador en un lenguaje de programacin que empieza con letra
mayscula y continua con mayscula o minscula, tiene como mnimo 5
caracteres y no puede terminar en las subcadenas CIA CIO (MAYUSCULAS).
Solucin:
1 = {a, b, c,..., z, A, B, C,..., Z}
may [A-Z]
min [a-z]
let [may, min]
sinC [ A,B, D-Z, min]
sinI [A-H, J-Z, min]
sinOA [B-N, P-Z, min]
iden may let
+
(sinC let
2
| let sinI let | let
2
sinOA)