Upload
estuardo-per
View
99
Download
1
Embed Size (px)
Citation preview
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
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.
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.
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*)*.
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}
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:
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*
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
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
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).