You are on page 1of 91

1

 
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

 
 

2.2.3.1 Lenguajes  y Maquina as que los rreconocen   


En  la  siguiente
e  tabla  se  muestra 
m el  tipo  de  lenguaje  según  la  jerarquíaa  de  Chomskky,  el 
Lenguajee que se reco onoce y el tip po de máquina que puede evaluar eeste tipo de lenguaje. 

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

             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

 

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

 
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

 
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*    =
 

8.2.5.2 Evaluación n NFA 


             
*ab*b  = a+b+  
 aaa*bb*    =  a*
 

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

 
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.1 Clausura (  Sn) 


Con
njunto de esstados del NFA alcanzables desde el estado Sn, ccon transicio
ones ε (épsilo
on)  
ƒ Por ejemp
plo desde q0
0 se puede aalcanzar  q1, q2, q4. 
 

 
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    

B   C   D  

C   C   D  

D   C   D  

 
 
 
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

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}  

D = {1,2,3,6}   B = {1,2,3,4}  A = {1,2,3} 


Construyendo
o a partir de este el diaggrama de Mo
oore. 

 
 
 
   
  

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

 
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

 

 
 
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. 
 
 

 
  
 

You might also like