10
01/08/2012 1 Definición de Lenguajes Regulares Definición de Expresiones Regulares Solución de Ejercicio No. 1 Un lenguaje regular es un tipo de lenguaje formal que satisface las siguientes propiedades: Los lenguajes más sencillos que se considerarán son los lenguajes regulares, es decir, los que se pueden generar a partir de los lenguajes básicos, con la aplicación de las operaciones de unión, concatenación y * de Kleene un número finito de veces. Puede ser reconocido por: un autómata finito determinista un autómata finito no determinista un autómata de pila un autómata finito alterno una máquina de Turing de solo lectura Es generado por: una gramática regular una gramática de prefijos Es descrito por: Una expresión regular

C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

Embed Size (px)

Citation preview

Page 1: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

1

Definición de Lenguajes RegularesDefinición de Expresiones Regulares

Solución de Ejercicio No. 1

Un lenguaje regular es un tipo de lenguaje formal que satisface las siguientes propiedades:◦ Los lenguajes más sencillos que se considerarán son los lenguajes regulares,

es decir, los que se pueden generar a partir de los lenguajes básicos, con la aplicación de las operaciones de unión, concatenación y * de Kleene un número finito de veces.

Puede ser reconocido por:◦ un autómata finito determinista◦ un autómata finito no determinista◦ un autómata de pila◦ un autómata finito alterno◦ una máquina de Turing de solo lectura

Es generado por:◦ una gramática regular◦ una gramática de prefijos

Es descrito por:◦ Una expresión regular

Page 2: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

2

Un lenguaje regular sobre un alfabeto dado se define recursivamente como:

◦ El lenguaje vacío es un lenguaje regular◦ El lenguaje cadena vacía {ε} es un lenguaje regular◦ Para todo símbolo a ∈ {a} es un lenguaje regular◦ Si A y B son lenguajes regulares entonces A ∪ B (unión),

A•B (concatenación) y A* (clausura o estrella de Kleene) son lenguajes regulares

◦ Si A es un lenguaje regular entonces (A) es el mismo lenguaje regular

◦ No existen más lenguajes regulares sobre

Todo lenguaje formal finito constituye un lenguaje regular. Otros ejemplos típicos son todas las cadenas sobre el alfabeto {a, b} que contienen un número par de aes o el lenguaje que consiste en varias aes seguidas de varias bes.

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón "H(a|ä|ae)ndel“.

La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.

Page 3: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

3

Se construyen utilizando los operadores unión, concatenación y clausura de Kleene (alternativamente la cerradura positiva).

Además cada expresión regular tiene un autómata finito asociado o viceversa.

Alternación◦ Una barra vertical separa las alternativas. Por ejemplo, "marrón|castaño" es similar a

decir marrón o castaño.

Cuantificación◦ Un cuantificador tras un carácter especifica la frecuencia con la que éste puede ocurrir.

Los cuantificadores más comunes son +, ? y *:

◦ + El signo más indica que el carácter al que sigue debe aparecer al menos una vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola, hoooola, etcétera.

◦ ? El signo de interrogación indica que el carácter al que sigue puede aparecer como mucho una vez. Por ejemplo, "ob?scuro" es similar a decir oscuro y obscuro.

◦ * El asterisco indica que el carácter que lo precede puede aparecer cero, una, o más veces. Por ejemplo, "0*42" es similar a decir 42, 042, 0042, 00042, etcétera.

Agrupación◦ Los paréntesis pueden usarse para definir el ámbito y precedencia de los demás

operadores. Por ejemplo, "(p|m)adre" es lo mismo que "padre|madre", y "(des)?amor“ permite decir amor y desamor.

Page 4: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

4

1. Para los lenguajes dados sobre Σ = {a, b} construir una expresión regular de él y un Autómata Finito que lo acepte:

◦ a) L = {w|w tiene cero o más pares de a′s}

◦ b) L = {w|w tiene un numero impar de a′s}

◦ c) L = {w|w tiene un numero múltiplo de 3 de a′s}

◦ d) L = {w| toda a en w está entre dos b′s}

◦ e) L = {w| no hay dos a′s consecutivas en w}

◦ f ) L = {w| w no contiene la subpalabra aa ni bb}

a) Una expresión regular que represente el lenguaje L es b*(ab*ab*)*.

b) Una expresión regular para este lenguaje es: b*ab*(ab*ab*)*.

Page 5: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

5

c) Una expresión regular para este lenguaje es: b*(ab*ab*a)*.

d) Una expresión regular para este lenguaje es: b*⋃ b+(ab+)*.

1. Hallar un autómata finito que acepte el lenguaje dado

◦ a) L = {w| w contiene un número impar de a′s y un número par de b′s}

◦ b) L = {w| w contiene un número par de a′s y un número par de b′s}

◦ c) L = {w| w contiene un número impar de a′s y un número impar de b′s}

◦ d) L = {w| w contiene un ab o ba como subpalabras}◦ e) L = {w| w contiene un ab y ba como subpalabras}◦ f ) L = {w| w contiene un ab ó ba como subpalabras,

pero no ambas}

Page 6: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

6

a) Un diagrama de transición del autómata finito es:

b) Cambiando el estado de aceptación del autómata representado arriba obtenemos el autómata:

c) De nuevo cambiando el estado de aceptación obtenemos el autómata correspondiente

d) A continuación un diagrama de transición de un autómata finito determinista que acepta el lenguaje cuyas palabras contienen las subpalabrasab o ba o ambas:

Page 7: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

7

Que sea capaz de reconocer expresiones aritméticas válidas de longitud arbitraria que comprendan enteros positivos separados por signos de suma, resta, multiplicación y división.

Solución: Σ = {d, op}

Estado = 1

Leer el siguiente simbolo de la entrada

while no_es_fin_de_cadena do

case Estado of

1 if simbolo actual es un digito then Estado = 2

else salir a la rutina de error

2 if simbolo actual es un digito then Estado = 2

else if simbolo actual es un operador then Estado = 3

else salir a la rutina de error

3 if simbolo actual es un digito then Estado = 4

else salir a la rutina de error

4 if simbolo actual es un digito then Estado = 4

else if simbolo actual es un operador then Estado = 3

else salir a la rutina de error

Leer el siguiente simbolo de la entrada

end while

If Estado = 4 then print "La cadena analizada es válida"

else print "La cadena analizada es inválida"

Estado\Simbolo d op FDC

1 2 error error

2 2 3 error

3 4 error error

4 4 3 ACEPTAR

Estado = 1

Leer el siguiente simbolo del flujo de entrada

Case simbolo of

digito Entrada = 'd'

operador Entrada = 'op'

marca de fin de cadena Entrada = 'FDC'

ninguno de los anteriores Salir a la rutina de error

Estado = Tabla[Estado, Entrada]

If Estado = 'error' then salir a la rutina de error

Until Estado = 'ACEPTAR'

Expresión Regular

d⁺.op.d⁺

ó

dd*.op.dd*

Page 8: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

8

Que reconozca cadenas que representan números reales positivos en notación decimal o exponencial, como 35.7, 2.56E10, 25E4, 23E+8 ó 34.0E-7

Solución: Σ = {d, ., E, +, -}

Estado = 1

Leer el siguiente simbolo de la entrada

while no_es_fin_de_cadena do

case Estado of

1 if simbolo actual es un digito then Estado = 2

else salir a la rutina de error

2 if simbolo actual es un digito then Estado = 2

else if simbolo actual es un punto then Estado = 3

else salir a la rutina de error

3 if simbolo actual es un digito then Estado = 4

else salir a la rutina de error

4 if simbolo actual es un digito then Estado = 4

else if simbolo actual es un operador exponencial then Estado = 5

else salir a la rutina de error

5 if simbolo actual es un digito then Estado = 7

else if simbolo actual es un signo positivo o negativo then Estado = 6

else salir a la rutina de error

6 if simbolo actual es un digito then Estado = 7

else salir a la rutina de error

7 if simbolo actual es un digito then Estado = 7

else salir a la rutina de error

Leer el siguiente simbolo de la entrada

end while

If Estado = 4 o Estado = 7 then print "La cadena analizada es válida"

else print "La cadena analizada es inválida"

Expresión Regular

A=d⁺.d⁺

B=d⁺.d⁺(E(d⁺|(+|-)d⁺)

C=d⁺E(d⁺|(+|-)d⁺)

A ⋃ B ⋃ C

Estado = 1

Leer el siguiente simbolo del flujo de entrada

Case simbolo of

digito Entrada = 'd'

punto Entrada = '.'

operador exponencial Entrada = 'E'

signo positivo Entrada = '+'

signo negativo Entrada = '-'

marca de fin de cadena Entrada = 'FDC'

ninguno de los anteriores Salir a la rutina de error

Estado = Tabla[Estado, Entrada]

If Estado = 'error' then salir a la rutina de error

Until Estado = 'ACEPTAR'

Estado\Simbolo d . E + - FDC1 2 error error error error error2 2 3 5 error error error3 4 error error error error error4 4 error 5 error error ACEPTAR5 7 error error 6 6 error6 7 error error error error error7 7 error error error error ACEPTAR

Page 9: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

9

Que reconozca nombres de variables válidas (según condiciones dadas en clase) y números decimales válidos.

Solución: Σ = {_, L, d, .}

Estado = 1

Leer el siguiente simbolo de la entrada

while no_es_fin_de_cadena do

case Estado of

1 if simbolo actual es una letra then Estado = 2

else if simbolo actual es un guion bajo then Estado = 3

else if simbolo actual es un digito then Estado = 5

else salir a la rutina de error

2 if simbolo actual es un digito o una letra then Estado = 2

else if simbolo actual es un guion bajo then Estado = 4

else salir a la rutina de error

3 if simbolo actual es un digito o una letra then Estado = 2

else salir a la rutina de error

4 if simbolo actual es un digito o una letra then Estado = 2

else salir a la rutina de error

5 if simbolo actual es un digito then Estado = 5

else if simbolo actual es un punto then Estado = 6

else salir a la rutina de error

6 if simbolo actual es un digito then Estado = 7

else salir a la rutina de error

7 if simbolo actual es un digito then Estado = 7

else salir a la rutina de error

Leer el siguiente simbolo de la entrada

end while

If Estado = 2 o Estado = 7 then print "La cadena analizada es válida"

else print "La cadena analizada es inválida"

Expresión Regular

A=d⁺.d⁺

B=L|(_(L|d)(L|d|_(L|d))*

A ⋃ B

Estado = 1

Leer el siguiente simbolo del flujo de entrada

Case simbolo of

digito Entrada = 'd'

punto Entrada = '.'

guion bajo Entrada = '_'

letra Entrada = 'L'

marca de fin de cadena Entrada = 'FDC'

ninguno de los anteriores Salir a la rutina de error

Estado = Tabla[Estado, Entrada]

If Estado = 'error' then salir a la rutina de error

Until Estado = 'ACEPTAR'

Estado\Simbolo L d _ . FDC

1 2 5 3 error error

2 2 2 4 error ACEPTAR

3 2 2 error error error

4 2 2 error error error

5 error 5 error 6 error

6 error 7 error error error

7 error 7 error error ACEPTAR

Page 10: C3 - Expresiones Regulares y Solucion a Ejercicios No. 1

01/08/2012

10

Genere un diagrama según las condiciones que usted indique.

De lo anterior se le pide que genere las respectivas tablas de transiciones y analizadores léxicos (generados a partir del diagrama y tabla de transiciones respectivamente).