Professional Documents
Culture Documents
PROCESADORES DE LENGUAJE
NOMBRE DE CURSO: Lenguajes Formales y de Programación
Sección B+
OBJETIVOS: • Definir que son los procesadores de lenguajes.
• Distinguir las fases que componen un traductor.
• Describir cuales son los elementos componen la
fase de análisis.
1.1 Procesadores de lenguaje
Los procesadores de lenguaje son todos los programas que a través de una entrada
escrita en un lenguaje de programación pueden manipular herramientas de software y
hardware de un computador. Estos procesadores de lenguaje se dividen en traductores e
intérpretes. Aunque es muy común confundir estos conceptos, ya que poseen similares
características, internamente la forma en que procesan el lenguaje es muy distinta. (1)
A continuación se muestra un diagrama de cómo se dividen los procesadores del
lenguaje. Los traductores en: compiladores, ensambladores y preprocesadores. Y los
Intérpretes se dividen en puros, avanzados e incrementales.
Imagen 1: Jerarquía de los procesadores de lenguajes
1.1.1 Traductor
Un traductor es un programa que recibe un código fuente y lo traduce a otro código,
generalmente a un código objeto. Esta traducción no afecta el resultado del código y tanto el
código fuente, como el objeto poseen el mismo funcionamiento.
Los traductores utilizan un lenguaje fuente LF que utiliza el traductor para generar a
través de un lenguaje de implementación LI o lenguaje host un lenguaje objeto LO. Es decir, un
LF por medio de un LI genera un LO. En la siguiente imagen se puede comprender esta
secuencia. (2)
Imagen 2: Funcionamiento estándar de un Traductor
1.1.2 Compilador
Los compiladores son programas que reciben un lenguaje fuente de nivel medio o
superior y lo transforman a un programa objeto, que puede ser ensamblador o de máquina. Un
compilador traduce, pero no es capaz de ejecutar pues esta no es su función. Además de esto
los compiladores pueden reconocer errores al momento de compilar y no generará un código
objeto hasta no tener el lenguaje fuente sin ningún error.
Imagen 3: Funcionamiento estándar de un compilador
El programa objeto luego debe de ser ejecutado, y a través de la ejecución se le
introducen los datos para obtener los resultados esperados.
1.1.3 Ensamblador
Los ensambladores son programas que traducen de lenguaje ensamblador a lenguaje de
máquina. A través de los ensambladores se integran los módulos de un programa, identifica y
resuelve direcciones de memoria, especifica la memoria necesaria para la ejecución, incorpora
datos y códigos necesarios para la futura ejecución.
Un ensamblador está relacionado internamente con la arquitectura del computador, esto
debido a que debe generar código de máquina especifico para el modelo, lee cada línea en
lenguaje ensamblador y la traduce a una línea de código de máquina. Existen algunos
ensambladores llamados macroensambladores que utilizan macroinstrucciones, ésta
macroinstrucción se traduce a varias instrucciones de máquina.
Imagen 4: Ejemplo del funcionamiento de un ensamblador
1.1.3.1 Preprocesador
El preprocesador o precompilador, es un programa que se ejecuta antes del compilador.
Este programa es capaz de reconocer lenguaje embebido o incrustado dentro del lenguaje
principal o anfitrión, y luego convertir este lenguaje embebido hacia el lenguaje anfitrión.
El lenguaje anfitrión es cualquier tipo de lenguaje de alto nivel, y puede contener un
lenguaje embebido de un nivel superior, como una consulta hacia una base de datos, un cálculo
estadístico, una simulación, etc. Este tipo de traductores es utilizado para la incorporación de
nuevas herramientas de propósito especial dentro de lenguajes ya establecidos.
En la siguiente imagen se puede observar un código escrito en lenguaje C, que tiene
embebido lenguaje ensamblador. Para que sea ejecutado un traductor leerá este código y lo
transformará de forma que lo comprenda el compilador de C.
Imagen 5: Ejemplo de código embebido
1.1.3.2 Pseudocompilador
Es un programa muy similar a un compilador, con la diferencia principal que el código
objeto que genera no puede ser ejecutado en un computador, es indispensable la ejecución en
una máquina virtual. El código generado se le denomina código de byte.
La principal ventaja es que permite utilizar emuladores de los microprocesadores
existentes, y al momento de compilar se produce el código necesario para cada uno de ellos.
Esto permite que el código sea independiente de la plataforma y del hardware.
1.1.4 Intérprete
Un intérprete es un programa diseñado para ejecutar instrucciones de un código
determinado, no genera ningún tipo de código adicional, y es completamente ejecutable. Los
intérpretes permiten ejecutar rutinas, aunque generan mayor número de líneas de código que
un compilador.
El funcionamiento de un intérprete se basa en el código fuente, la interpretación de
acuerdo a los datos ingresados y los resultados obtenidos. En la siguiente figura se muestra
dicho proceso.
Imagen 6: Funcionamiento estándar de un intérprete
Los intérpretes generan código más pesado, sin embargo son más flexibles al momento
de compilar y depurar. Además la mayoría de los intérpretes permiten la portabilidad del
lenguaje y la sencillez en su implementación.
El proceso de interpretación de un lenguaje puede ser iterativo o recursivo. La
interpretación iterativa es por medio de la ejecución línea tras línea, donde cada línea se analiza
y luego se ejecuta; hasta no encontrar otra instrucción. Mientras que la interpretación
recursiva se hace en dos fases, una de especificación semántica y la otra de implementación,
este tipo de interpretación no es muy adecuado debido ineficiencia al momento de ejecutar.
Los intérpretes se dividen en puros, avanzados e incrementales. (2)
1.1.4.1 Intérpretes puros
Este tipo de intérpretes surgen en la primera generación de computadores, pues era la
forma en que trabajaban estos. El proceso es a través del análisis de cada sentencia y su
ejecución hasta finalizar todo el programa fuente. Al momento de encontrar algún error se
debe de comenzar nuevamente el proceso.
En la siguiente figura se observa el esquema general de un intérprete puro, donde a
través de un lenguaje fuente, el intérprete comienza a procesar instrucción por instrucción,
colocándola temporalmente en la memoria para crear la tabla de etiquetas donde se
almacenan los procedimientos y funciones del programa. Al momento de evaluar el código
almacenado en memoria, se ingresan los datos necesarios y si es correcta la sintaxis de esta se
ejecuta, y se continua el proceso, buscando dentro de la memoria la siguiente instrucción.
Esquema general de un intérprete puro
1.1.4.2 Intérpretes avanzados
Los intérpretes avanzados completan el proceso de interpretación con un análisis previo
del programa fuente, para establecer si existe algún tipo de error sintáctico previo a la
traducción, esto permite a demás que el intérprete genere código intermedio que será
ejecutado en la memoria, código de byte. Esto facilita la ejecución de este código en cualquier
sistema operativo que contenga un intérprete de código de byte.
Los lenguajes como Quick‐BASIC, Turbo Pascal y el lenguaje Java son ejemplos claros de
este tipo de intérprete. Por ejemplo, en lenguaje Java, cuando se utiliza un programa con
extensión .java se compila produciendo varios ficheros de extensión .class (escritos en
bytecode) que luego pueden ser utilizados en aplicaciones de internet.
En la siguiente imagen se muestra el esquema general de un intérprete avanzado, la fase
previa de análisis y la utilización de un intérprete puro para la ejecución de este.
Imagen 7: Esquema general de un intérprete avanzado 1
1.1.4.3 Intérpretes Incrementales
Debido a la existencia de algunos lenguajes que permiten la creación y el manejo de
funciones u objetos luego del tiempo de compilación, son creados durante la ejecución. Existen
traductores, denominados intérpretes incrementales o evaluadores parciales. En los que a
medida que se va ejecutando y se ingresan los datos, se van creando las estructuras necesarias
para poder procesar otro subconjunto de instrucciones o datos dependientes del código ya
analizado.
1
Cueva Lovelle, Juan Manuel. Cuaderno Nº 10 Conceptos básicos de Procesadores de Lenguaje. 1998.
1.2 Estructura de los traductores
La estructura interna de los traductores de lenguaje consiste en dos fases importantes el
análisis y la síntesis. En ellas el traductor, ya sea un compilador o un intérprete logra reconocer
un lenguaje específico, analiza el código fuente genera un reporte de errores de este análisis. Si
es adecuado el código fuente pasa a la fase de síntesis en la genera el código objeto o el código
destino, mientras no exista ningún tipo de error. En la siguiente imagen se puede observar este
proceso.
Imagen 8: Fases de un traductor
La fase de análisis se encarga de verificar el código fuente, a través de la descomposición
del código y el análisis minucioso a través de los componentes léxicos o tokens. Luego de
agrupar todos los elementos en tokens se verifica su estructura sintáctica y semántica de cada
sentencia o instrucción del lenguaje. A través de este análisis construye una tabla de símbolos
en los que se almacenan todos los identificadores encontrados. Si existe algún error dentro del
código, se deben mostrar los errores para su posterior manejo.
La fase de síntesis se encarga de la generación del lenguaje intermedio, o lenguaje objeto,
que servirá como apoyo en la generación de código de máquina final. En está fase de análisis se
realiza un reporte de los errores al momento de general el código y preservar la funcionalidad
adecuada del código generado.
En la siguiente imagen se muestra la estructura interna de los traductores, y todos los
pasos necesarios que debe llevar este a partir de un programa fuente para analizar y sintetizar
hacia un programa objeto.
Imagen 9: Estructura interna de un traductor
1.2.1 Fase de análisis
1.2.1.1 Análisis léxico
En esta fase del análisis se toman todos los elementos del programa fuente, agrupando
cada uno de los caracteres para formar tokens o componentes léxicos. Por medio de estos
tokens se logra identificar: constantes, identificadores, variables, funciones, clases, palabras
reservadas, operadores, etiquetas, etc. Este análisis se conoce también como explorador o
scanner.
1.2.1.2 Análisis sintáctico
Esta fase también es conocida como parsing, en la que a través del agrupamiento de los
tokens se establece la estructura de las sentencias del programa a través de clases sintácticas.
Este análisis crea un árbol sintáctico que es construido a partir de unas reglas llamadas
gramática. Existen dos clases de analizadores sintácticos los ascendentes y los descendentes
dependiendo de su dirección de análisis.
1.2.1.3 Análisis semántico
En esta fase del análisis se verifica el contexto en el que se encuentra cada sentencia
sintáctica, por lo general se realiza simultáneamente con el análisis sintáctico. Dentro de este
análisis se encuentra la evaluación de tipos o comprobación de tipos, en la que se verifica el
contexto de cada uno de los tipos utilizados y su adecuado manejo.
1.2.2 Tabla de símbolos
La tabla de símbolos permite almacenar todos los identificadores que se encuentran al
momento del análisis, pueden ser variables, constantes, procedimientos o tipos. Esta
información es de utilidad al momento de realizar un análisis semántico y en la comprobación
de tipos. La tabla de símbolos puede ser almacena en una tabla de hash, un árbol binario o
cualquier otra estructura que permita hacer búsquedas rápidas.
Los principales atributos que poseen las tablas de símbolos son:
• Detalle del identificador: variable, función, constante, procedimiento, etc.
• Tipo: real, carácter, cadena, entero, etc.
• Tamaño: puede ser definido por dimensiones o numero de bytes a utilizar.
• Ubicación de inicio dentro de la memoria, para procedimientos y funciones.
• Lista de detalles, si se necesita algún tipo de información adicional de campos,
estructuras, registros o parámetros, etc.
1.2.3 Manejador de errores
El manejador de errores permite establecer si el programa fuente posee algún error ya
sea de tipo léxico (caracteres no definidos), sintáctico (estructura inadecuada) o semántico
(contexto no apropiado) permitiendo así la depuración de los errores. Es indispensable que el
manejador de errores, genere un reporte específico para poder ajustar el código en forma
adecuada.
1.2.4 Fase de síntesis
1.2.4.1 Generación de código intermedio
La generación de código intermedio permite generar código que es portable e
independiente de la máquina, ya que es entendible solamente por una máquina abstracta. En
muchas ocasiones este código puede ser lenguaje C, y puede utilizar cuartetos o tercetos para
representar el código, pero se usa comúnmente la notación polaca; tomando en cuenta que
esta es más fácil para traducir a código de máquina.
1.2.4.2 Optimización de código
La optimización de código es la verificación que se hace del código ya generado para
mejora la velocidad al momento de la ejecución. Existen algunas reglas para optimizar que
elimina la reescritura de código, la eliminación de código inalcanzable, la optimización de
temporales, etc. que permiten un código mas eficiente.
La optimización de código en algunos traductores se hace en el código intermedio,
aunque hay algunos que hacen la optimización en el código de máquina.
1.2.4.3 Generación de código
Posterior a la generación de código intermedio se procede a la traducción de este código
a código ensamblador o para el funcionamiento dentro de una pila. Cada una de las
instrucciones pasa a ser instrucciones en código de máquina donde se involucran posiciones
reales de memoria por medio de los registros.
1.3 Referencias Bibliográficas
1. Rodríguez Avila, Eduardo René. Diseño de Compiladores. 2000.
2. Cueva Lovelle, Juan Manuel. Cuaderno Nº 10 Conceptos básicos de Procesadores de
Lenguaje. 1998.
3. Aho, Alfred V., Sethi, Ravi y Ullman, Jeffrey D. Compiladores, pricipios, técnicas y
herramientas. 1990.
4. Gálvez Rojas, Sergio y Mora Mata, Miguel Ángel. Traductores y Compiladores con
LEX/YACC, JFLEX/CUP Y JAVACC. 2005.
2
LENGUAJES FORMALES
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir que es un lenguaje formal.
• Describir la jerarquía básica de los lenguajes
formales.
• Distinguir la relación entre los lenguajes
formales y la jerarquía de Chomsky.
2.1 Lenguajes formales
Los lenguajes formales son lenguajes artificiales construidos por los lógicos y los
matemáticos con la intención de describir otros lenguajes naturales o formales.
Los lenguajes formales son utilizados para modelar la mecánica, física, matemática,
ingeniería eléctrica. Un lenguaje formal está formado por un alfabeto y una gramática. El
alfabeto es un conjunto de símbolos no interpretables.
La gramática es un conjunto de reglas que determinan qué cadenas de símbolos del
alfabeto serán gramaticalmente correctas o bien formadas.
2.1.1 Operaciones
Existen operaciones que se pueden realizar entre la definición de los lenguajes como:
Concatenación
Intersección
Unión
Complemento, etc.
2.1.2 Cerraduras
El lenguaje vacio: Φ
El lenguaje con la cadena vacía: {λ}
Lenguajes finitos sin λ L
Lenguajes finitos con λ L*
2.2 Jerarquía de chomsky
En 1959, Noam Chomsky clasificó las gramáticas en cuatro tipos de lenguajes y esta
clasificación es conocida como la jerarquía de Chomsky. Estos lenguajes sirven como base para
la clasificación de lenguajes de programación.
2.2.1 Definición de una Gramática
Es una cuádrupla G = (N,T,P,S) donde:
N es un alfabeto de símbolos no terminales (variables).
T es un alfabeto de símbolos terminales (constantes).
S Є N es el símbolo inicial o axioma de la gramática.
P es el conjun
nto de reglass de produccción, de la fo
orma { α → β
β | α β }
2.2.2 Definición
D n de Lengu
uaje
Seaa G = (N,T,P,S) una gram
mática con α
α → β P.
Un lenguaje sse dice de tipo i (i = 0, 1, 2, 3), si pu
U uede ser gen
nerado por u
una gramáticca de
tipo i, y no dee tipo i+1.
Cada una de las gramáticcas incluye a las siguientes G3 G2 G1 G0
2.2.3 Je
erarquía
La jerarquía dee Chomsky d define a los lenguajes, ssegún la sigu
uiente estructura. Tomando
en cuentta que los lenguajes recursivamen nte enumerrables contieenen a los demás tipo
os de
lenguajess.
G3 G2 G1 G0
Lenguaajes recurssivamentee Enumeraables
Lenguajes sensiibles al co
ontexto
Lengu
uajes librees de conttexto
Lengguajes Regulares
TIPO
O LEN
NGUAJES TIPO DE M
MAQUINA
Reccursivamentte
0 Máquina de Turing
Enu
umerable
Sensibles al Autómata Lineal
1
contexto Acotado
2 Libres de contexto Autómatas de Pila
Autómatas Finitos y
3 Regulares
Expresiones Regulares
2.2.3.2 Gramáticas Regulares
Las gramáticas regulares sólo pueden generar a los lenguajes regulares. Pueden existir dos
gramáticas regulares que generen el mismo lenguaje regular. Las producciones son de la forma:
α → β, con α Σ* N Σ* y β Σ*.
2.2.3.2.1 Clasificación
Las gramáticas regulares se clasifican según la ubicación de los símbolos No Terminales
dentro del lado derecho de la producción, por lo que se pueden clasificar por gramática regular
Gramática Regular por la Derecha
Donde los símbolos NO Terminales de la Producción son colocados a la derecha.
A → aB
Gramática Regular por la Izquierda
Donde los símbolos NO Terminales son colocados a la izquierda de la producción.
A → Ba
2.2.3.2.2 Ejemplo
Expresión Regular: a+bc*
G = ( {S, A}, {a, b, c}, P, S )
P = { S → aS
S → bA
A → ε
A → cA }
2.2.3.3 Gramáticas Libres de Contexto
Mayor capacidad para especificar lenguajes al incluir algunos lenguajes que no son
reconocidos por un autómata finito. Son útiles para describir expresiones que tengan una
anidación arbitraria o estructuras de en bloque.
2.2.3.3.1 Características
Un alfabeto Σ de caracteres llamados símbolos terminales con los cuales se obtienen
cadenas que forman las palabras de un lenguaje.
Un conjunto de símbolos no terminales, uno de los cuales es el símbolo S conocido
como símbolo inicial.
Un conjunto finito de producciones de la forma
NOTERMINAL → cadenas finitas de Terminales y/o no terminales.
2.2.3.3.2 Ejemplo
G = ( {E}, {a, +, ‐, ( , ) }, P, E )
P = E → E + E
E → E – E
E → ( E )
E → a
2.2.3.4 Lenguajes Sensibles al Contexto
Generan lenguajes sensibles al contexto, al entorno de uso. Son utilizados por los
Autómatas lineales acotados. Las producciones P son de la forma: αAβ → αγβ, Donde una
cadena que puede ser reemplazada por alguna producciones.
G=(N, Σ, S, P) es una gramática sensible al contexto donde N es un alfabeto de
símbolos no terminales. Σ es un alfabeto de símbolos terminales con N∩Σ=∅. S ∈ N es el
símbolo inicial. P es un conjunto finito de producciones de la forma α→β, donde α, β, ∈ (N ∪
Σ)+.
2.2.3.4.1 Ejemplo
Por ejemplo, la gramática dada por:
S → abc|aAbc
Ab → bA
Ac → Bbcc
bB → Bb
aB → aa|aaA
3
GRAMÁTICAS REGULARES
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir que es una gramática.
• Identificar los componentes de una
gramática.
• Determinar la estructura para la construcción
de gramáticas regulares.
• Construir de árboles de derivación
3.1 Gramáticas
Sirven para describir como se genera las cadenas del lenguaje. Se clasifican al igual que los
lenguajes según la Jerarquía de Chomsky como gramáticas tipo 0, 1, 2 y 3. Están construidas a
través de cuádruplas.
3.1.1 Definición de Gramática
Definida por G = (N, T, P, S) donde
N Conjunto finito de símbolos no terminales
T Conjunto finito de símbolos terminales
P es un conjunto finito de producciones
S Símbolo distinguido o axioma agresividad
3.1.2 Componentes de una Gramática
3.1.2.1 N Conjunto de No Terminales
Son símbolos definidos que representan una expresión del lenguaje. Por lo general son
representados por medio de letras o palabras en MAYUSCULAS.
3.1.2.2 S: Símbolo Inicial
Símbolo No Terminal que representa el inicio de la gramática. Por lo general se utiliza la
letra S.
3.1.2.3 T: Conjunto de Terminales
Son símbolos que representan a un token de la gramática. Los tokens son expresiones
que se definen por medio de Expresiones Regulares. Estos por lo general son representados por
medio de letras o palabras en minúsculas.
3.1.2.4 P: Conjunto de Producciones
Es la representación de una definición de la gramática. Utiliza en el lado izquierdo un
símbolo No Terminal. En el lado derecho una secuencia de símbolos terminales y no terminales;
también puede ser una cadena vacía (ε).
3.2 GRAMÁTICA regular
Generan los lenguajes regulares, reconocidos por un autómata finito. Estas son las
gramáticas más restrictivas. El lado derecho de una producción es como mínimo un símbolo
TERMINAL o NO TERMINAL y del lado izquierdo como máximo uno NO TERMINAL.
3.2.1 Producción
Está Representada generalmente por:
Lado Izquierdo ::= Lado Derecho
Símbolo No Terminal ‐> • ε (Cadena vacía)
== • terminal (uno o más)
= • No Terminal (uno o más)
Æ • Combinación de terminales y No
Terminales.
Algunos ejemplos de producciones pueden ser:
Correctas Incorrectas
A Æ a A Æ aεB
B Æ Aa AB Æ C
C Æ ε C Æ C
D Æ numero a Æ DE
E Æ num . num eF Æ ε
F Æ aA
G Æ AabcD
3.2.2 Clasificación de Gramáticas Regulares
Las gramáticas regulares se dividen dependiendo de la estructura de las producciones,
esto depende de la dirección hacia la que se expanden:
3.2.2.1 Lineales a derecha
Donde los símbolos No Terminales se ubican al lado derecho de la producción.
G1 = ({A, B}, {a}, P1, S1)
S1 → ε
S1 → aA
A → aB
A → a
B → aA
3.2.2.2 Lineales a izquierda
Los símbolos No Terminales se ubican al lado izquierdo de la producción.
G2 = ({C, D}, {a}, P2, S2)
S2 → ε
S2 → Ca
C → Da
C → a
D → Ca
3.2.3 Árbol de Derivación
Consiste en la esquematización de la Gramática, a través de una entrada determinada.
Permite identificar la secuencia por la cual una cadena es reconocida por la gramática. También
son llamados árboles sintaxis.
3.2.3.1 Construcción
El símbolo inicial S es la raíz
Los nodos internos son símbolos NO Terminales
Las hojas son los símbolos terminales.
No son árboles binarios, cada nodo representa la secuencia de cada producción,
independientemente del número de símbolos.
3.2.3.2 Ejemplo
Gramática
S Æ aB
B Æ bC
C Æ c
Cadena
abc
3.2.4 Gramáticas Ambiguas
Una gramática G(N,T,P,S) se considera ambigua, si existen por lo menos dos árboles de
derivación que la representen. Una gramática es ambigua si por lo menos posee una
producción ambigua. La ambigüedad es una propiedad indecidible.
Aquí hay un ejemplo de este tipo de gramáticas, donde se reconoce la misma entrada
aabb.
4
EXPRESIONES REGULARES
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir los operadores de las expresiones
regulares y su utilización
• Construir expresiones regulares para definir
un lenguaje.
• Establecer la relación entre las Expresiones
Regulares y los Lenguajes Regulares
5.1 Expresiones Regulares
Las Expresiones Regulares representan de forma más simple un Lenguaje Regular, estas
representan un patrón por medio del cual se construyen palabras. Utiliza caracteres de un
alfabeto (Σ) definido, para la construcción.
5.1.1 Elementos de Definición
Los elementos más comunes utilizados para definir una Expresión Regular son:
* repetición 0 o más veces Clausura de Kleene
+ repetición 1 o más veces Cerradura Positiva
? aparición 1 o ninguna vez
( ) agrupación
| alternativa
[ ] agrupación de caracteres
5.1.1.1 Cerradura de Kleene
También conocida como Cerradura de Estrella, esta se define como: A*= U n≥0 An. La
cadena se forma al realizar 0 o más concatenaciones de los símbolos o caracteres que aplica.
a* = { ε , a, aa, aaa, aaaa, aaaaa }
0*21 = { 21 , 021, 0021, 00021 }
5.1.1.2 Cerradura Positiva
Esta cerradura se define como: A+ = n>0 An. Donde la cadena está formada por al
menos una repetición de la cadena.
a+ = { a, aa, aaa, aaaa, aaaaa}
hi+ = { hi, hii, hiii, hiiii }
mi+au+ = { miiiiau, miiiauuuuu, miau }
5.1.1.3 Aparición
Utiliza el símbolo ? para indicar si el carácter que lo precede puede aparecer o no dentro
de la cadena.
a? = { ε , a }
(sub)?marino = { submarino, marino}
5.1.1.4 Alternativa
Utiliza la barra “ | ” para indicar que puede existir alguna alternativa dentro de los
símbolos o caracteres.
blanco|negro = { blanco , negro }
norte|sur|este|oeste = { sur, este, norte}
(m|p)adre = { madre, padre }
5.1.1.5 Agrupación
Se utilizan los paréntesis para agrupar los caracteres del alfabeto que se utilizan. Y la
precedencia de los operadores que se utilizan.
(bis|tatar)?abuel(o|a) = { abuelo, bisabuelo, tatarabuelo, bisabuela }
(1|2)a = {1a , 2a }
5.1.1.6 Agrupación de Caracteres
Se utilizan los corchetes [ ] para agrupar clases de caracteres, así se define una gama de
símbolos relacionados entre sí. Utilizando solo uno de ellos.
[A‐Z] = { A, B, D, Y, M, O, P }
[0‐9] = dígitos
[0‐9]+.[0‐9] = números con un decimal.
5.1.2 Precedencia
El orden de precedencia para los operadores es:
Paréntesis ()
Cerraduras
Concatenación .
Unión +
5.1.3 Propiedades ER
Las propiedades de las Expresiones Regulares permiten la simplificación de las ER.
Permiten definir expresiones equivalentes que reconocen el mismo lenguaje. Por ejemplo sean
α, β y γ expresiones regulares.
α + (β + γ) = (α + β) + γ
α + β = β + α
α + Φ = Φ + α = α
α(β + γ) = αβ + α γ
αΦ = Φα = Φ
α λ = λ α = α donde λ = ε
Sean α, β y γ expresiones regulares.
λ* = λ
Φ* = λ
α* = λ + αα*
(α*+β*)* = (α*β*)* = (α+β)*
(αβ)*α = α(αβ)*
(α*β)* α* = (α+β)*
(α*β)* = (α+β)* β + λ
5.1.4 Ejemplo: Generación de Palabras
Sea ER = (ab*) | (abc*) las palabras que genera son: ab, a, abc, abb, abbb, abcc, abcccc.
Sea ER = z?x+(z*o)+ las palabras que genera son: zxo, xzo, zxzo, xxxozo, zxxo.
Las palabras más corta que se obtiene de
(01+0*) | (10?1) Æ 01 , 11
a(b+c)*(ab) Æ aab
((ab+ba)|baab)* Æ abba , baab
5.1.5 Ejemplo: Construcción ER
Expresar, mediante una expresión regular, el lenguaje formado por el alfabeto S = {a, b},
donde las palabras inician con a y finalizan siembre con bb.
(abb)* X
a (a|b)*bb √
a*b* X
Expresar, mediante una expresión regular, el lenguaje formado por el alfabeto S = {a,
b,c}, donde todas las cadenas no tiene ninguna subcadena ac se denota mediante la expresión
regular: c*(abc*)*.
5.2 GR
RAMÁTICAS y Ex
xpresion
nes regullar
5.2.1 Reglas de
R Construccción
Φ es una expresión reegular que d
describe el leenguaje vacío
o.
ε es unaa expresión
n regular que
q describee el lenguaaje {ε}, el lenguaje posee
p
únicamen nte la cadenaa vacía.
Para cadaa α Σ, a es una ER y den
nota el lengu
uaje {α}
Si r yy s son expre
esiones regulares que deescriben los lenguajes L((r) y L(s) resp
pectivamentte:
r + s es un
na expresión
n regular quee describe ell lenguaje L(r) U L(s)
r . s es una expresión regular que describe el lenguaje L(rr) . L(s)
r* es una expresión reegular que d
describe el leenguaje L(r)**.
5.2.2 Relación E
R Expresion
nes Regullares y Le
enguajes R
Regularess
ER Lenguaje
ε: {ε}
0: {0}
001: {001 1}
0 | 1: {0, 11}
(1| ε )001: {1, εε}{001} = {10
001,001}
(110)**(0 |1): {110 0}*{0, 1}
Dos o más expresiones reggulares son eequivalentess, si se refierren al mismo
o lenguaje.
EER LR
R
0
011* 01
1, 011,0111
0
01+ 01
1111,…
6
AUTÓMATAS FINITOS DETERMINÍSTICOS
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir que son los Autómatas finitos y los
Autómatas Finitos Determinísticos.
• Establecer las formas de representar los
Autómatas.
• Definir las propiedades de los Autómatas
Finitos Determinísticos.
6.1 Au
utómata
as finitoss
Tammbién llamaado máquina de estadoo finito. Es un
u modelo matemático o que recibee una
cadena de
d símboloss de un alffabeto y deetermina la cadena peertenece al lenguaje quue el
autómataa reconoce. Puede reconocer o trad ducir una cad dena de símbolos.
Loss autómatas a través dee una entradda de símbolos cambian de estados. Por ejemplo un
video, do
onde cada enntrada modiifica el estad
do del video..
Es una máquinna que interrpreta expreesiones regu
ulares, y recconoce cadeenas de enttrada.
Inspeccio
ona cada símmbolo de la ccadena comparándola ccon una tabla de transiciones y el esstado
actual en
n que se enccuentra, si ees reconocid do cambia su estado y sse mueve una celda hacia la
derecha, hasta que reconoce to odos los elem mentos de la cadena. Laa cadena se divide en Celdas
de memo oria para alm
macenar. Lo os estados so on la memo oria de los autómatas. C Cuando finaliza la
cadena, aacepta o recchaza la cadeena, depend diendo de procesamiento o.
6.1.1 Diseño de Autómatas Finitos
Pasos para diseñar un buen autómata
1. Establecer un conjunto de estados que “memoricen” condiciones importantes
2. Establecer correctamente cual es el estado inicial y los estados de aceptación
3. Establecer las transiciones que permiten pasar de un estado a otro
Algunos errores al momento de construir cualquier autómata:
Aceptar cadenas que no se debería aceptar, pues no están definidas.
No aceptar todas las cadenas que debe de aceptar.
6.1.2 Notación
Descripción abstracta
Tabla de transición
Diagrama de transiciones (Diagrama de Moore)
6.1.3 Descripción Abstracta
Se define por medio del quinteto (Q, Σ, q0, A, δ) donde:
Q es un conjunto finito (de estados)
Σ es un alfabeto (finito) de símbolos
q0 Є Q (El estado inicial)
A ⊆ Q (El conjunto de estados aceptores)
δ es una función de transición
6.1.4 Tabla de Transición
Esta se genera a través de un producto cartesiano de los estados y los símbolos del
alfabeto.
Σ
0 1
Q
→ A A B
B A C
* C A c
Donde → es el estado inicial y * es un estado de aceptación
6.1.5 Diagrama de Transiciones
El Diagrama de Transiciones es el encargado de definir el flujo de un autómata, donde:
Los estados son nodos
Las transiciones son arcos
6.2 Autómatas finitos Determinísticos
También es llamado AFD o en sus siglas en inglés DFA Deterministic finite automata.
Puede detectar símbolos conforme llegan y se basa en el estado actual y el símbolo recibido,
ejecutar una transición.
Estos tienen un número finito de estados además los Autómata Finito Determinista no
debe tener ambigüedades. El diagrama de transición cada arco posee solo un símbolo del
alfabeto, al salir de un estado.
6.2.1 Definición
Se define por medio del quinteto (Q, Σ, q0, A, δ) donde:
Q es un conjunto finito (de estados)
Σ es un alfabeto (finito) de símbolos
q0 Є Q (El estado inicial)
A ⊆ Q (El conjunto de estados aceptores)
δ es una función de transición Q x δ a Q
6.2.2 Función de Transición
Para todo q Є Q & a Є Σ, δ(q, a) = p es decir, existe un estado p al que se mueve al estar
en el estado q, y lee el carácter a. Una transición: δ(q, a, q0) Є Q normalmente se describe q
→ q0
6.2.3 Algoritmo
A o
Inicia en el eestado Iniciaal, y en el primer símbolo
o de entradaa
q = estado aactual
s = símbolo actual en la cinta
Mientras (s! = blanco) h haga
q == δ (q, s)
s = siguientee símbolo a lla derecha een la cinta en
ntonces
si qn = Estado Final
Accepta
Sino
Noo Acepta
6.3 No
otación G
General DFA
Estado
Estado Iniccial
Estado de Aceptación
Transición
6.3.1 Ejemplos d
E de transfo
ormación
n
6.3.1.1 Transform
mación ER –– DFA. Ejem
mplo 1
6.3.1.2 Transform mación ER –– DFA. Ejem mplo 2
Parrtiendo de laa expresión rregular ac+b
b
Partiendo de la expresión regular ac*b
6.3.1.3 Expresión Regular – DFA
Tomando en cuenta la utilización de paréntesis se define la secuencia (ba)*. Por estar
contenida en una cerradura, indica que puede o no venir, por lo que q3 es un estado de
aceptación. Por Ejemplo bb|(a(ba)*)* de define como:
Para finalizar, la secuencia (a (..) )*, parte del estado inicial con una transición a, y dando la
recursividad en q3. Pero tomando en cuenta que puede recibir cadena vacía q0 puede ser
estado final. bb|(a(ba)*)*
6.1.1.1 NFA – Tabla de Transición
1. A partir del DFA se obtiene la siguiente tabla de transición
Σ a b
Q
0 3 1
1 2 ‐
2 ‐ ‐
3 3 4
4 3 ‐
2. A partir de la definición (Q, Σ, q0, A, δ) donde:
Σ a b
Q
0 0 1
1 0 2
2 0 3
Q= {0,,1,2,3} 3
3 3 3
Σ ={a, b}
q0 =0
A={0, 1, 2}
Parrte del estad
do inicial q0 =0 Y se mueeve con a al eestado q0 y ccon b al estaado q1
Del estado q1 ccon a pasa al estado 0 y con b al estaado q2
Del estado q2 ccon a pasa al estado 0 y con b al estaado q3
Del estado q3 ccon a pasa al estado 0 y con b al estaado q3
Loss estados de aceptación son q0, q1 y q2
6.3.2 Generació
G ón de DFA
A a partir de Definiciones LR
R
Al sser los DFA reconocedo
ores de LR, p
puede generrarse un DFA
A a partir dee definicionees de
lenguaje como:
Cadenas teerminadas een 00
Cadenas con dos "unos" consecutivos
Donde el alfabeto = {0,1}
6.3.2.1 Transformación
Cadenas terminadas en 00
Cadenas con dos "unos" consecutivos
6.4 Reconocimiento de Cadenas
El autómata parte de un estado inicial y solamente reconocerá la cadena, si esta termina
en un estado de aceptación. Si no es así no se reconoce la cadena.
Comprobar: aaab
bbba
6.4.1 Comprobando
6.4.1.1 Comprobando la cadena: aaab
q0 → q1
q1 → q2
q0 → q1
q1 → q2
q2 → q2
q0 → q1
q1 → q2
q2 → q2
q2 → q2
q2 es estado de aceptación,
Se acepta la cadena
6.4.1.2 Comprobando la cadena: bbba
q0 → q3
q0 → q3
q3 → q3
q0 → q3
q3 → q3
q3 → q3
q0 → q3
q3 → q3
q3 → q3
q3 → q3
q3 NO ES estado de aceptación,
no es aceptada por DFA
7
JFLAP – DFA
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Identificar una herramienta que sea de fácil uso y
completa para el estudio de Autómatas y
Lenguajes
• Identificar el proceso de creación y evaluación de
DFA a través de la Herramienta.
• Ejercitar la construcción de DFA.
7.1 Herramientas de aprendizaje
Existen varias herramientas para el aprendizaje de los autómatas como:
Visual Automata Simulator
JFLAP
dk.brics.automaton
Proyecto SEPa
Exorciser (en Alemán)
7.1.1 Visual Autómata Simulator
Es una aplicación que permite la creación y simulación de DFA o NFA. Fue creada por el
Departamento de Ciencia y Computación de la Universidad de San Francisco, EEUU y
desarrollada por David Galles
7.1.2 dk.brics.automaton
Creado en la University of Aarhus, Dinamarca, por el profesor Anders Møller y desarrollado
con librerías de C, y java, para la utilización de ER, DFA y NFA.
7.1.3 Proyecto SEPa
Software para la Enseñanza de Parsing, es un conjunto de herramientas
desarrolladas para el aprendizaje de los autómatas, en la Universidad Católica de Santiago
del Estero.
Chalchalero
Kakuy
Caburé
Suri!
7.1.4 Exociser
Fue desarrollado como material en SwissEduc , Alemania. Este programa sirve de apoyo
a los profesores para la enseñanza de sus alumnos en la secundaria. Exorciser es una colección
de ejercicios interactivos sobre el tema de Autómatas y Lenguajes.
7.2 JF
FLAP
Es un conjuntto de herraamientas grráficas que ayudan al aprendizaje de conceeptos
relacionaados con loss Lenguajes Formales y Autómatas. Incluye elementos com mo ER, DFA, NFA,
Gramáticcas entre otrros.
7.2.1 Origen
O
JFLLAP nace en Rensselaer Polytechnicc Institute, (RPI) en Nueeva York (EEUU). RPI ess una
institucióón dedicada a la docenciia y a la inveestigación, esspecialmentte en cienciaa y ingenieríaa.
En el año 1990
0 surge el pro
oyecto NPDA A (C++) que serviría parra el aprendiizaje del cursso de
Teoría dee Autómatas. En 1995 la Universidaad de Duke,, en Carolinaa del Norte (EEUU) continúa
coordinando el proye 96 se traslada todo el código a JAVA.
ecto. En 199
7.2.2 Requerim
R mientos
Es para m
múltiples sisteemas operattivos:
Mac OS X
nix | Linux
Un
Windows
W
Utiliza javva 1.4 o supeerior
No requie
ere instalació
ón solamentte se ejecutaa el archivo jflap.jar
7.2.3 JF
FLAP Auttómatas fiinitos Detterminístticos
7.2.3.1 Modo de U
Uso
dar clic sobrre JFLAP.jar sse muestra eel siguiente m
Al d menú.
7.2.3.2 Creación de un DFA en FLAP
En el siguiente ejemplo, se muestra un autómata que reconoce una secuencia de al
menos una ‘a’ y finaliza con ‘b’. La expresión regular asociada es a+b
7.2.3.3 Evaluación de Cadenas por JFLAP
Luego de haber construido nuestro autómata es importante verificar que cumpla con las
condiciones. Es decir sea una secuencia de al menos una ‘a’ y finalice con una ‘b’.
8
AUTÓMATAS FINITOS NO DETERMINÍSTICOS
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir que son los Autómatas Finitos No
Determinísticos.
• Identificar el proceso de construcción de un
DFA a partir de varias definiciones
• Evaluar cadenas de entrada
8.1 Autómatas finitos no Determinísticos
También es llamado AFN o en sus siglas en inglés NFA Non‐Deterministic Finite Automata. Es
decir, el autómata acepta aquellos lenguajes en los que al procesar la cadena se obtenga un
conjunto en el que haya al menos un estado de Aceptación.
Los Autómata Finito No Determinista puede tener ambigüedades. Los estados pueden
tener una o más transiciones con diferentes símbolos del lenguaje. El autómata acepta una
palabra si existe al menos un camino desde el estado q0 a un estado final con la palabra de
entrada.
8.1.1 Definición
Se define por medio del quinteto (Q, Σ, q0, A, δ) donde:
Q es un conjunto finito (de estados)
Σ es un alfabeto (finito) de símbolos
q0 Є Q (El estado inicial)
A ⊆ Q (El conjunto de estados aceptores)
δ es una función de transición δ *: Q x Σ* → 2Q
8.1.2 Función de Transición
Se define como sigue: δ *: Q x Σ* → 2Q
Para todo q Є Q, δ *(q,Λ) = {q}
Para todo q Є Q, y Є Σ* & a Є Σ
Tomando en cuenta que 2Q es el conjunto de potencias de Q, el conjunto de todos los
subconjuntos de Q
8.2 Construcción de NFA
Puede partir desde una tabla de transiciones, generando un diagrama de Moore.
A través de una expresión regular, generando un diagrama de Moore.
Por medio de una gramática regular.
8.2.1 Tabla de Transición – NFA Ejemplo 1
A partir de la definición (Q, Σ, q0, A, δ) donde:
Q= {0,1,2,3}
Σ ={a, b}
q0 =0
A={3}
Genere el Diaggrama de Mo
oore que rep
presenta al N
NFA
ΣΣ A B
Q
0 1,2 ‐
1 ‐ 1,3
2 2 3
3 3 ‐
8.2.2 Construcc
C ción NFA
Paarte del estaado inicial q ueve con a al estado q1 yy q2 y con b no tiene
q0 =0 y se mu
movimiento.
Del estado q1 con b pasa al estado q3 3 y
q4, con a no hay movvimiento
Del estado q2 con a pasa al estado q3 y con b al eestado q4
Del estado q
D q3 con a pasaa al estado q
q4 y con b no
o tiene movimiento
Ell estado de aaceptación ees q4
8.2.3 NFA – Expresión Regular
A partir del NFA se puede deducir la expresión o las expresiones asociadas a este.
a ( b*b| a*b) a*
a ( b*|a*) b a*
8.2.4 Tabla de Transición – NFA Ejemplo 2
A partir de la definición (Q, Σ, q0, A, δ) donde:
Q= {0,1,2,3,4} Σ
a b
Σ ={a, b} Q
q0 =0 0 2 3
A={1,2,3,4}
1 ‐ 3
2 1 ‐
3 4 1,3
4 1,4 1,3
8.2.4.1 Construcción NFA
Partimos de dibujar los estados necesarios, indicando los estados iniciales y finales.
Q= {0,1,2,3,4}
q0 =0
A={1,2,3,4}
Se crean las
transiciones de los estados.
8.2.5 Transform
T mación ER
R – NFA
El o
orden para la transformación de la expresión en el autómata se da porr la preceden
ncia.
Primero: Lass cerraduras (* +)
Se
egundo: Las concatenacciones
Te
ercero: Las seleccioness ( | )
Perro utilizando
o adecuadam
mente los paaréntesis si eexisten.
8.2.5.1 Expresión Regular – NFA
Porr ejemplo las siguientes Expresioness Regulares EEquivalentess, el NFA pueede ser el
mismo.
= a*ab*b = a+b+
aa*bb* =
L
8.2.6 Gramática Regular – NFA
Partiendo de la una gramática se puede construir un diagrama de Moore que represente
el NFA.
<ID> Æ <Letra>(<Letra>|<dígito>)*
<letra> Æ a|b|c|…|z
<dígito>Æ 0|1|2|…|9
8.2.6.1 Construcción NFA
Partimos de la definición del ID (Identificador)
Se debe tomar en cuenta
que cuando reciba cualquier otro símbolo, (puede ser espacio) se terminara de reconocer.
8.2.6.2 Evaluación NFA
Evaluando la cadena temp7a_ al llegar a “_” se finaliza el reconocimiento definiendo al
identificador como temp7a
8.2.7 Algoritmo de Análisis NFA
Inicia en el estado Inicial, y en el primer símbolo de entrada
C = Clausura ( { S0} )
s = símbolo actual en la cinta
Mientras (s! = blanco) haga
C = Clausura(move(C,s))
s = siguiente símbolo de la derecha
SI C ∩ F <> vacío
Acepta
Si no
No acepta
9
MÉTODO DE THOMPSON
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir el proceso del Algoritmo de
Construcción de Thompson a partir de una ER
• Construir a partir de NFA un DFA equivalente
por el cálculo de la cerradura
9.1 Allgoritmo
o de Construcció
ón Thom
mpson
El aalgoritmo co
onstruye a p
partir de exp
presiones reggulares un d
diagrama de NFA, para lluego
poder geenerar un DFFA mínimo equivalente. Utiliza una n
notación estándar para ggenerar un N
NFA
9.1.1 Nomencla
N atura de T
Thompson
n
Parra la represe una cadena vacía se utiliza el símbolo ε.
entación de u
Parra representtar un símbo dos y una transición parra el movimiento
olo, se utilizaan dos estad
con el sím
mbolo.
Parra la concate
enación de d
dos símbolo
os es necesario únicamente se unen
n cada uno d
de los
símboloss por
Parra la elección
n de alternativas, crear ttransicioness ε para la un
nión de las trransiciones.
Parra la cerrad
dura Positivaa, se agregan transicio
ones ε para retornar al
a estado prrevio,
permitiendo agregarr 1 o más vecces el símbo olo
Parra la cerradu
ura de Kleene, se agreggan transicio
ones ε para retornar a estado prevvio. Y
otra tran
nsición ε paraa saltar la traansición conn r.
9.1.2 Ejemplo M
E Método de
e Thompsson
Diaagrama del N
NFA que rep
presenta la EER a*b.
1. Parte de la ccerradura dee Kleene.
Para continu
2. P uar se generaan la concattenación del símbolo b
3. P
Para finalizar se numeraan los estado
os y se indicaa el estado in
nicial y final
9.2 Co
onversió
ón NFA – DFA
9.2.1 Cálculo de
C e la Cerrad
dura
Parrte de la unión de conju unto de estados perteneecientes al NNFA, que se representara por
un únicoo estado en el DFA. Do
onde existe un camino etiquetado que conducce del estad
do de
inicio al d
de aceptacióón.
9.2.2 Operacion
O nes de Cerrradura
9.2.2.2 Mov(T,a)
Representa el movimiento desde el estado T, con una transición a, que es parte del
alfabeto. La transición Mov(q2,a) logra llegar al estado q3
Es importante llevar el control de las cerraduras que se crean, llevar el control de su uso
e identificarlas cuando se haya finalizado el análisis. Además de indicar claramente los estados
de inicio y el final del autómata.
9.2.3 Construcción de Tabla de Transiciones
Cada estado se obtiene de la cerradura, y representa una fila.
Cada símbolo de entrada o carácter representa una columna.
La unión del estado y el símbolo representa el conjunto resultante al operar la
cerradura.
El estado de aceptación es el conjunto de estados en el que se incluye el estado de
aceptación
9.3 Transformación nfa – Dfa
La transformación se hace a través de la utilización de la cerradura de épsilon. La función
cerradura es concentrar en un sólo estado situaciones similares dentro del NFA original para la
construcción de un DFA equivalente.
9.3.1 Calculo de la Cerradura
Se calcula al estar en un estado si existe una trayectoria con épsilon: es decir, no se
requiere de un símbolo determinado para llegar a otro estado. Y a este se le asigna un nombre.
Por lo general una letra. Luego se calcula los movimientos de este a través de los símbolos
del NFA. Y se continúa con el siguiente estado.
9.3.2 Ejemplo NFA – DFA
Como ejemplo utilizaremos la expresión regular x ( x | y ) * x que se representa a través
del siguiente NFA.
C(0) = {0} → lo definimos como A
Mov(A,x) = {1} * calculamos el siguiente estado
Mov(A,y) = {}
C(1) = {1,2,3,5,8} → lo definimos como B
Mov(B,x) = {4, 9} * calculamos el siguiente estado
C(1) = {1,2,3,5,8} → lo definimos como B
Mov(B,x) = {4, 9}
Mov(B,y) = {6} * calculamos el siguiente estado
C(4,9) = {4,9,7,8,2,3,5} → C
Mov(C,x) = {4, 9} Æ C
C(6) = {6, 7, 8, 2, 3, 5} → D
Mov(C,x) = {4, 9} Æ C
Mov(C,y) = {6} Æ D
C(4,9) = {4,9,7,8,2,3,5} → C
Mov(C,x) = {4, 9} Æ C
Mov(C,y) = {6} Æ D
Luego terminado el proceso, se procede a crear una tabla de resumen de las transiciones
generadas.
x y
A B
DFA Resultado
10 MÉTODO DEL ÁRBOL Y CONSTRUCCIÓN DE
DFA POR MÉTODO DE SUBCONJUNTOS
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Definir el método de construcción de un DFA
óptimo por medio de los métodos del árbol y
de subconjuntos.
• Ejercitar la construcción de DFA partiendo de
ER.
10.1 Método del árbol
Se parte de una expresión regular que permite la reducción de estados repetitivos, produce
autómatas más eficientes y permite la eliminación de nulos.
10.1.1 Creando un DFA óptimo.
Paso 1: Aumentar la ER con $
Paso 2: Crear el árbol asociado a la ER
Paso 3: Calcular Anulable, first, last, follow (primero, último, siguiente)
Paso 4: Construir el AFD a partir del follow. (Método de Subconjuntos)
10.1.2 Aumento de ER con $
El símbolo $ permite definir la finalización de la expresión regular. Por ejemplo:
(b*|a*)a$
a*b(b|a*)$
(a|(ba)*)ba*$
10.1.3 Crear e
el árbol associado
or ejemplo la siguiente EER: (a|b)*ab
Po bb
10.1.4 o de Anula
Calculo able
10.1.5 Calculo
o de First / Primerro
10.1.6 Calculo
o de Last /
/ Último
10.1.7 Ejempllo Método
o del Árbo
ol
A
A partir de la ER (a|b)*ab
bb$
Enumerar las h
hojas del árb
bol
Calcular el An
nulable de caada nodo.
Calcular el First de cada
nodo.
Calcular el Last de cada n
nodo.
H
Hacer el calcu
ulo del Follow
10.2 M
ét
od
o
de
Su
bc
on
ju
nt
os
Para construir el DFA a partirr del Método
o de Subconjuntos, se debe seguir laas siguientess
reglas:
Cada subcconjunto se forma por laa unión del ffollow de cad os nodos del
da uno de lo
subconjun
nto en cuesttión. Vinculaado con la Exxpresión Reggular.
Cada subcconjunto corrresponde a un estado d
del DFA.
El primer subconjunto
o del es el firrst del nodo raíz
Repetir ell paso uno hasta que no existan subconjuntos.
10.2.1 Ejempllo Método
o de Subconjuntos
Parrtiendo del áárbol creado
o y el cálculo
o del follow sse pueden co
onstruir los siguientes
subconju
untos.
N
Nodo Folllow
1 1,2,,3
2 1,2,,3
3 4
A = {1,2,3}
4 5
B = {1,2,3,4}
C = {1,2,3,5} 5 6
D = {1,2,3,6}
6 ‐‐‐‐‐‐
Partiendo de estos subconjuntos formamos la tabla de transiciones,
a b
A = {1,2,3} B = {1,2,3,4} A = {1,2,3}
B = {1,2,3,4} B = {1,2,3,4} C = {1,2,3,5}
C = {1,2,3,5} B = {1,2,3,4} D = {1,2,3,6}
11
GRAMÁTICAS LIBRES DE CONTEXTO
NOMBRE DE CURSO: Lenguajes Formales y de Programación
SECCION B+
OBJETIVOS: • Identificar que es un Lenguaje Libre de
Contexto
• Definir las características de una Gramática
Libre de Contexto.
• Construir Gramáticas Libres de Contexto
utilizando la Notación BNF
11.1 Le
enguaje libres de
e Contex
xto
Con
ntexto se refiere al en
ntorno en que
q se encu
uentra, com
mo influye el
e entorno en
e el
significad
do de cada pparte. Puedee ser reconoccido por autómatas de p pila y está deefinido dentro de
la jerarqu
uía de Chommsky en el Tip po 2.
Le
enguajees recurrsivamente Enu
umerables
Lenguaj
L es senssibles al contexxto
Lenguaajes librees de co
ontexto
o
Lenguaajes Reegularees
La mayoría lenguajes de programación n, son lenguajes libres dde contexto yy están defin
nidos
por mediio de gramáticas libres d de contexto.. Cualquier leenguaje indeependiente del contexto o que
no conteenga la cad
dena vacía puede
p ser generado
g po or una Gramáticas Ind
dependientes del
Contextoo
11.2 Gr
ramática
as libress de Conttexto
También se le denominaa Gramáticass independieentes de contexto. Se d
definen en inglés
como CFG, Context FFree Grammar.
Con
ntexto se refiere al en
ntorno en que
q se encu
uentra, commo influye el
e entorno en
e el
significad
do de cada p parte. Tienen mayor cap pacidad paraa especificar lenguajes aal incluir alggunos
lenguajess que no son n reconocido os por un auutómata finiito, son útilees para desccribir expresiones
que tenggan una anidación arbitraria o estruccturas de en n bloque.
11.2.1 Características
Un alfabeto Σ de caracteres llamados símbolos terminales con los cuales se obtienen
cadenas que forman las palabras de un lenguaje.
Un conjunto de símbolos no terminales, uno de los cuales es el símbolo S conocido
como símbolo inicial.
11.2.2 Definición de la Gramática
Es una cuádrupla G = (N,T,P,S) donde:
N es un alfabeto de símbolos no terminales (variables).
T es un alfabeto de símbolos terminales (constantes). Pueden ser cadenas de
lenguaje.
S Є N es el símbolo inicial o axioma de la gramática.
P es el conjunto de reglas de producción, P ⊆ N × (T U N)*
11.2.3 Producción
La producciones son construidas a partir de la definición P ⊆ N × (T U N)*. Estas
producciones se representan del siguiente modo
E Æ a, con E Є N (Es No Terminal)
con a Є T (Es Terminal)
se lee “E produce a"
Donde cualquier símbolo No Terminal del lado derecho de la producción puede ser
remplazado por cualquier definición de ese mismo terminal del lado derecho.
S → E
E → E + E
E → num
11.2.4 Notació
ón BNF
Proviene de lla definiciónn Backus‐Naur Form. Es un sistema de reglas de derivación
n que
se utiliza para especiificar por medio de gram
máticas los lenguajes dee programación.
<sím
mbolo> ::= <<expresión d
de símboloss>
El lado izquieerdo es un nno terminal yy el lado derecho se deefine como u una expresióón de
símboloss Terminaless y No termin nales. Que rrepresenta aal conjunto d de símbolos por los cualles se
puede suubstituir el símbolo de la izquierda. Se utilizaa la barra “|” para den
notar opcion
nes a
seleccion
nar.
11.2.5 Ejempllos
Un ejemplo de
d una CFG en notació
ón BNF, que reconocee operacionees con núm
meros
enteros, como {5, 52
2+3, (1+3)*4 }
Donde E es unaa expresión Numérica y Num es un número
Un ejemplo de una CFG en
n notación BNF, que reco
onoce númeeros telefónicos, como {((512)
4587892, 54578931}}
Donde E es una expresión
n Numérica y Num es un número
Un ejemplo de una CFG en
n notación BNF, que reco
onoce númeeros identificcadores, com
mo
{a, t2, tem
mp4}
11.2.6 La Deriivación
El p
proceso de d
derivación dee una gramáática, nos peermite recon nocer una cadena de enttrada
a través d
de la gramáttica. Puede ddarse la deriivación por la izquierda o la derechaa, dependien
ndo
del símboolo que se derive. Por eejemplo, para reconocerr la cadena aaabb.
S → AB
B | A
A → aA
Aa | ε
B → Bb
b | b
1
11.2.6.1 Deriv
vación por la Izquierd
da
S AB aAaB aaB
B aaBb aaBbb aaabbb
11.2.6.2
2 Deriv
vación por la Derecha
a
S AB ABb ABbb
b Abbb aAabbb aabbb
11.2.7 Árbol d
de Deriva
ación
Puede vissualizarse en
n árbol de derivación, d
donde se recconoció la caadena aabbb
b.
11.2.8 Recurssividad
La recursividad
d se definee en una producción
p c
cuando el símbolo
s de la izquierd
da se
encuentrra también aa la derechaa de la producción. Existe recursivid dad por la izzquierda y ppor la
derecha, dependiend do de la ubiccación del símbolo, ya seea al principio o final de la produccióón.
11.2.8.1
1 Por la
a Derecha
2
11.2.8.2 Por la
a izquierda
a
Taambién se puede
p encoontrar produucciones quee tienen am
mbas clases de recursivvidad.
Una gram
mática se con nsidera recu
ursiva si al m
menos una dee sus produccciones es reecursiva.