CAPITULO 3: EXPRESIONES REGULARES 3.1. DEFINICION: Una expresión regular constituye una forma de representar un lenguaje en forma sintética. No cualquier lenguaje se puede representar mediante una expresión regular, los que son representables mediante una expresión regular se denominan lenguajes regulares. Dada una expresión regular r el lenguaje que representa es L(r) Una expresión regular se construye a partir de expresiones regulares más simples, usando un conjunto de reglas definitorias. 3.2. REGLAS DE DEFINICION DE LAS EXPRESIONES REGULARES: Las reglas de definición especifican como se forma L( r ) combinando de varias maneras los lenguajes representados por las subexpresiones de r. Las siguientes reglas definen las expresiones regulares del alfabeto V. 1) es una expresión regular, el lenguaje que representa es { }, es decir, el conjunto que contiene la cadena vacía. 2) Si a es un símbolo de V, entonces a es una expresión regular la cual representa el lenguaje { a }, el conjunto que contiene la cadena a. 3) Suponiendo que r y s son expresiones regulares que representan los lenguajes L ( r ) y L ( s ) entonces: ( r ) | ( s ) es una expresión regular que representa L ( r ) L ( s ) ( r ) . ( s ) es una expresión regular que representa L ( r ) . L ( s ) ( r ) * es una expresión regular que representa ( L ( r ) ) * ( r ) es una expresión regular que representa L ( r ) Ej: V = {n, o, s, i} y L = {no; si} es un lenguaje regular representado por la expresión regular (n).(o))|((s).(i)) Demostración: e.r. n (n) (o) (n).(o) (s).(i) ((n).(o)) | ((s).(i)) lenguaje {n} {n} {o} {n}.{o} = {no} {s}.{i} = {si} {no} U {si} = {no; si} = R (n) | (o) {n}U{o} = {n; o} (s) | (i) {s}U{i} = {s; i} ((n)|(o)) . ((s)|(i)) {n;o}.{s;i} = {ns; ni; os; oi} Un lenguaje designado por una expresión regular es un conjunto regular. 25 La especificación de una expresión regular es un ejemplo de definición recursiva. Las reglas 1 y 2 son la base. La regla 3 proporciona el paso inductivo. (a)|((b)*(c)) = a|b*c Se pueden evitar los paréntesis innecesarios en las expresiones regulares si se adoptan las convenciones: el operador * tiene la mayor precedencia y es asociativo por izquierda. la concatenación tiene la siguiente mayor precedencia y es asociativa por izquierda. | tiene la menor precedencia y es asociativo por izquierda. ((n).(o)) | ((s).(i)) = n . o | s . i ((n)|(o)) . ((s)|(i)) = (n | o) . (s | i) n | o . s | i n | o . s | i → {n} | {o} . {s} | {i} {n}U {o . s} U {i} = { n ; os ; i } Ej: Sea S = { a, b } e.r. lenguaje 1- a | b a {a} b {b} a | b { a }U{ b }={a; b} La expresión regular a | b designa el conjunto { a, b } (a | b).( a | b) {a; b}.{a; b}={aa; ab; ba; bb} 2- (a | b).( a | b) La expresión regular ( a | b ) ( a | b ) designa el conjunto { aa, ab, ba, bb } (conjunto de todas las cadenas de a y b de longitud 2) 3- (a|b)* (a|b)* {a|b}*={a|b}0U{a|b}1U{a|b}2U…… (*) recordando que: (*) = {ε}U {a; b} U {aa; ab; ba; bb}U 0 L = {ε} U{aaa;aab;aba;abb;baa;bab;bba;bbb}U L1 = L U …… = L2 = L . L {ε; a; b; aa; ab; ba; bb; aaa; ………} 3 2 L = L . L =L.L. L La expresión regular ( a | b ) * designa { 0 o más casos de una a o b } (a*b*)* 4- a | b* . c b* { b*}= {b}0U{b}1U{b}2U{b}3U…… = {ε}U{b}U{b}.{b}U{b}2.{b}U…… = {ε}U{b}U{bb}U{bb}.{b}U = {ε; b; bb; bbb; bbbb; …..} La expresión regular b* designa { 0 o más casos de una b } (conjunto de todas las cadenas de 0 o mas b) b* . c {ε; b; bb; bbb; bbbb; …..} . { c } = = {c; bc; bbc; bbbc; bbbbc; …..} La expresión regular b *.c designa {c y todas las que tienen 0 o más b seguidas de una c} a | b* . c { a }U {c; bc; bbc; bbbc; bbbbc; …..} = = {a; c; bc; bbc; bbbc; bbbbc; …..} La e. r. a | b* . c designa {a y todas las que tienen 0 o más b seguidas de una c} 26 Si 2 expresiones regulares r y s representan el mismo lenguaje, se dice que son equivalentes ( r = s ). Ej: (a|b)=(b|a) ( a | b )* = ( a* . b* )* (por propiedad de la operación cierre -kleene) 3.3. PROPIEDADES DE LAS EXPRESIONES REGULARES r|s=s|r r|(s|t)=(r|s)|t (r.s).t=r.(s.t) r.(s|t )=r.s|rt (s | t ) . r = s . r | t . r .r=r r.=r r*=(r|)* r**=r* | es conmutativo | es asociativo . es asociativa . es distributiva sobre | es el elemento identidad en la concatenación (elemento neutro) es el elemento identidad * es idempotente 3.4. DEFINICIONES REGULARES Una definición regular permite presentar una expresión regular de un modo más comprensible o manejable. Es posible definir expresiones regulares usando nombres como si fueran símbolos. Se basa en ponerle nombre a distintas subexpresiones de la expresión. Dado un alfabeto V, una definición regular es una secuencia de definiciones de la forma: <d1> r1 <d2> r2 . . . . <dn> rn (→ significa designa o denomina) donde cada <di> es un nombre distinto (se subrayan) y cada ri es una expresión regular sobre los símbolos de V U { d1, d2, .... ,di-1 } (los símbolos básicos y los nombres previamente definidos) r1 está definida sobre el conjunto V r2 está definida sobre el conjunto V U {d1} r3 está definida sobre el conjunto V U {d1; d2} …….. rn está definida sobre el conjunto V U {d1; d2; ……; dn-1} Ejs: 1. V = { A, B, ......., Z, a, b, ......., z } { 0, 1, ......., 9 } letra A | B | ..... | Z | a | b | ..... | z digito 0 | 1 | ..... | 9 id letra . ( letra | digito ) * { A, B, ......., Z, a, b, ......., z } . { A, B, ......., Z, a, b, ......., z ,0, 1, ......., 9 }* Lenguaje de los identificadores de Pascal – L . (L U D)* 27 2. V= { Claudio, Analía, Diego, juega, no juega, tenis, fútbol, voley } nombre Claudio | Analía | Diego actividad juega | no juega deporte tenis | fútbol | voley oración nombre . actividad . deporte * 3. V = {0, 1, ….., 9, E, +, -, •} digito 0 | 1 | ..... | 9 dígitos → digito . digito* → { 0, 1, ......., 9 } . { 0, 1, ......., 9 }* frac-opt → • . dígitos | ε → ({•} . {0, 1, …, 35, ….}) U {ε} {•0, •1, …, •35, …., ε} exp-opt → (E . (+ | - | ε) . dígitos) | ε {E} . {+, -, ε} . {0, 1, …, 35,…..} U ε num → dígitos . frac-opt . exp-opt lenguaje de los números sin signo 3.5. ABREVIATURAS EN LA NOTACIÓN Algunas construcciones aparecen con mucha frecuencia en una expresión regular. En estos casos se pueden usar algunas abreviaturas. 1) “ Uno o más casos”. El operador + significa “uno o más casos de”. La expresión regular a+ representa al conjunto de todas las cadenas de 1 o más a. Entonces: r r* = r + r ------------ L(r) ( r )+ -------- ( L(r) )+ → cerradura positiva del leng. de r r* = r+ | ε ( L(r) )* = ( L(r) )+ U {ε} 2) “Cero o un caso”. El operador ? significa “cero o un caso de” (op. unario) Entonces: r | ε = r ? (r)? ------ L(r) U {ε} 3) “Clases de caracteres”. Se puede abreviar una expresión regular a | b | c, mediante la notación [ a b c ] o [ a – c ] digito 0 | 1 | .....| 9 digito [ 0 – 9 ] digitos digito . digito * digitos digito + fraccion_optativa digitos | fraccion_optativa ( digitos ) ? exp_opt ( E ( + | - | ) digitos ) | exp_opt ( E ( + | - ) ? digitos ) ? num digitos . fraccion_optativa . exp_opt num digitos . fraccion_optativa . exp_opt 28