Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Materia:
Lenguajes Formales y Autómatas
Docente:
Ing. Rolando Gonzales
Estudiantes:
✓ Kevin Vidal Calcina Ríos
✓ Giorgio Leandro Gonzales Bustos
✓ Paul Mauricio Melgar Zabala
✓ Gabriel Ortiz Balcázar
✓ Hans Denker Ortiz
✓ Cristhian Egüez Aguilar
Cadena
Una cadena de caracteres (que también se denomina en ocasiones palabra) es una secuencia
finita de símbolos seleccionados de algún alfabeto.
Una cadena o palabra es una secuencia finita de símbolos que pertenecen a un alfabeto y
comúnmente se denota con la letra.
EJEMPLO: si ∑= {0,1}, entonces ∑1= {0,1}, ∑2= {00, 01, 10, 11}, ∑3= {000, 001, 010, 011, 100,
101, 110, 111}, etc.
Cadena Vacía
La cadena vacía es aquella cadena que presenta cero apariciones de símbolos. Esta cadena,
designada por £, es una cadena que puede construirse en cualquier alfabeto
EJEMPLO: observe que ∑0= {£}, independientemente de cuál sea el alfabeto ∑. Es decir, £ es la
única cadena cuya longitud es 0.
Lenguajes
Un conjunto de cadenas, todas ellas seleccionadas de un ∑*, donde ∑ es un determinado
alfabeto se denomina lenguaje. Ya que estas pueden ser cualquier cadena que cumpla con lo
siguiente, está formada por los símbolos. Los lenguajes habituales pueden interpretarse como
conjuntos de cadenas.
EJEMPLO: Seria el inglés, donde la colección de las palabras correctas inglesas es un conjunto
de cadenas del alfabeto que consta de todas las letras.
Tipo de Lenguajes
LENGUAJES DECLARATIVOS: Es fundamentalmente lenguajes de órdenes, dominados por
Sentencias que expresan “lo que hay que hacer” en vez de “cómo hacerlo”.
LENGUAJES DE ALTO NIVEL: Son los más utilizados como lenguajes de programación permiten
que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y
comprensible por otros programadores.
LENGUAJE ENSAMBLADOR: Es el programa en que se realiza la tracción de un programa escrito
en un programa escrito en ensamblador y lo pasa a lenguaje máquina. Directa o no directa de
la traducción en que las instrucciones no son más que instrucciones que ejecuta la
computadora.
LENGUAJE MAQUINA: Es como la maquina interpreta lo que nosotros queremos hacer es una
lectura de 0 y 1 es decir binario.
Gramática
La gramática es un ente formal para especificar, de una manera finita, el conjunto de cadenas
de símbolos que constituyen un lenguaje.
Autómata
Un autómata es una construcción lógica que recibe una entrada y produce una salida en
función de todo lo recibido hasta ese instante. En el caso de los Procesadores de Lenguaje un
autómata es una construcción si dicha cadena pertenece o no a un determinado lenguaje.
Definición de AFD
Definición
Un Autómata recibe secuencialmente una cadena de símbolos y cambia de estado por cada
símbolo leído o también puede permanecer en el mismo estado. Al final de la lectura el estado
del Autómata nos indica si la cadena es aceptada o mejor dicho pertenece al Lenguaje que
describe nuestra máquina. Si al final de leer todos los símbolos de entrada la máquina está en
alguno de los estados Finales entonces esa cadena es aceptada, si el estado no es final
entonces la cadena no pertenece al lenguaje.
A = {Q, q0, F, Σ, δ}
Dónde:
q0: Estado inicial donde q0 ∈ Q. Debe haber uno y sólo un estado inicial.
δ: Función de Transición Q × Σ → Q.
En un diagrama de transición existe un nodo por cada estado qi de Q. Los estados finales están´
encerrados en un círculo doble. El estado inicial q0 es apuntado por una flecha que no
proviene de ningún otro estado. Para cada estado qi y un símbolo a, hay exactamente una y
sólo una flecha que inicia en qi y termina en δ(qi, a), es decir en qk, la flecha es etiquetada
como a. Si qk pertenece a F decimos que la entrada es aceptada.
Debe haber exactamente una flecha saliendo de cada estado por cada símbolo a0, a1, a2..., an,
por tanto, todos los estados tienen el mismo número de fechas saliendo de cada uno de ellos.
Con esto garantizamos que nuestro Autómata pueda ser llamado Determinista. No importa el
estado ni el símbolo leído, siempre hay una transición definida.
Para describir por completo una función de transición δ ocupamos una Tabla de Transición. Las
columnas se etiquetan con los símbolos de entrada, la filas son etiquetadas con los estados y
en las intersecciones se colocan los nuevos estados δ(qi, a), suponiendo que qi ∈ Q es la
columna y a ∈ Σ las filas que lo intercepta.
El estado inicial tiene una flecha que apunta a él, los estados finales tienen una flecha que sale
de ellos y los estados que no son finales y no son el inicial no tienen flecha. En caso de que
nuestro estado inicial también sea un estado final, se apuntará con una flecha doble ↔.
Una tabla de transición representa una función δ la cual recibe un símbolo y un estado, si
queremos introducir una cadena ω donde ω ∈ ∗, donde Σ∗ es la 5 cerradura de Σ, 1 en lugar de
un solo símbolo debemos usar δ∗ conocida como Función de Transición Extendida que nos
permite manejar una cadena dado que es una función de Q × Σ∗ y cumple con:
Σ= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, /, ^, ., (, ), x, raíz }
Σ 𝑇 : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + | - | * | / | ^ | ( | ) | . | x |raíz
Σ𝑁 : Operador, Digito, Pabierto, Pcerrado, Punto, Número, Decimal, Tipo Número, Expresión
𝐺 = ( Σ 𝑇 , Σ𝑁 , 𝑆, 𝑃 )
Pess = {Número := Digito | Digito Número, Decimal := Número | Numero Punto Numero,
Tipo Número := Decimal | Número, Expresión := Tipo Número Operador Expresión | Operador
Expresión | Tipo Número | Pabierto Expresión Pcerrado Expresión | Pabierto Expresión
Pcerrado | Expresión Operador Expresión, Operador := + | - | * | / | raíz, Digito := 0 | 1 | 2 | 3 | 4 |
5 | 7 | 8 | 9 | x, Pabierto := (, Pcerrado := ), Punto := .}
Axioma
<Operador>:= + | - | * | / | raíz
<Digito> := 0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | x
<Pabierto>:= (
<Pcerrado> := )
<Punto>:= .
<Numero>:= <Digito>
<Numero>:= <Digito><Numero>
<Decimal>:= <Numero>
<Decimal>:= <Numero> <Punto> <Numero>
<Tipo Número>:= <Decimal> | <Numero>
<E1>:= <Expresión>
<E1>:= <Tipo Número><Operador><Expresión>
<E1>:= <Numero> ^ <Tipo Número><Operador><Expresión>
<E1>:= <Digito> ^ <Número> raíz <Tipo Número><Operador><Expresión>
<E1>:= x ^ <Digito> raíz <Número> + <Tipo Número>
<E1>:= x ^ 4 raíz <Digito> + <Número>
<E1>:= x ^ 4 raíz 2 + <Digito>
<E1>:= x ^ 4 raíz 2 + 1
<E2>:= <Expresión>
<E2>:= <Pabierto> <Expresión> <Pcerrado><Expresión>
<E2>:= ( <Pabierto> <Expresión> <Pcerrado><Expresión> ) <Operador><Expresión>
<E2>:= ( ( <Expresión> <Operador> <Expresión> ) <Operador> <Expresión> ) + <Tipo
Número>
<E2>:= ( ( <Tipo Número> - <Tipo Número> ) * <Expresión> <Operador> <Expresión> ) +
<Decimal>
<E2>:= ( ( <Número> - <Número> ) * <Tipo Número> / <Tipo Número> ) + <Numero>
<Punto> <Numero>
<E2>:= ( ( <Digito> - <Digito> <Número> ) * <Número> / <Número> ) + <Digito> . <Digito>
<E2>:= ( ( 2 - 3 <Digito> ) * <Digito> / <Digito> ) + 3 . 5
<E2>:= ( ( 2 - 3 0 ) * x / x ) + 3 . 5
Software
Analizador Léxico
Token
/*
*/
package AnalizadorLexico;
/**
* @author rgc
*/
this.valor = valor;
return tipoToken;
this.tipoToken = tipoToken;
return tipoOperador;
}
this.tipoOperador = tipoOperador;
return prioridad;
this.prioridad = prioridad;
return valor;
this.valor = valor;
}
Función
/*
* To change this license header, choose License Headers in Project Properties.
*/
package AnalizadorLexico;
import java.util.ArrayList;
import java.util.Stack;
/**
* @author rgc
*/
int estado = 0;
int i = 0;
switch(estado)
case 0:
i++;
else
if(esDigito(s.charAt(i)))
{
aux = s.charAt(i)+"";
i++;
estado = 1;
else
if(s.charAt(i)=='+')
i++;
estado = 4;
else
if(s.charAt(i)=='-')
i++;
estado = 5;
else
if(s.charAt(i)=='*')
i++;
estado = 6;
else
if(s.charAt(i)=='/')
i++;
estado = 7;
else
if(s.charAt(i)=='^')
i++;
estado = 8;
else
if(s.charAt(i)=='(')
i++;
estado = 9;
else
if(s.charAt(i)==')')
i++;
estado = 10;
else
if(s.charAt(i)=='@')
estado = 11;
else
estado = 13;
i+=4;
else
estado = 12;
break;
case 1:
if(esDigito(s.charAt(i)))
i++;
else
if(s.charAt(i)=='.')
i++;
estado = 2;
else //otro
estado = 3;
break;
case 2:
if(esDigito(s.charAt(i)))
i++;
else
estado = 3;
break;
case 3:
listaToken.add(t1);
estado = 0;
break;
case 4:
// filicidades es un token
listaToken.add(t2);
estado = 0;
break;
case 5:
listaToken.add(t3);
estado = 0;
break;
case 6:
listaToken.add(t4);
estado = 0;
break;
case 7:
listaToken.add(t5);
estado = 0;
break;
case 8://^
listaToken.add(t6);
estado = 0;
break;
case 9://( es 3
listaToken.add(t7);
estado = 0;
break;
listaToken.add(t8);
estado = 0;
break;
case 11:
fin = true;
break;
case 13:
listaToken.add(t10);
estado = 0;
break;
case 12:
error = true;
break;
if(error == true)
return listaToken;
int estado = 0;
int i = 0;
switch(estado)
case 0:
if(s.charAt(i)== ' ')
i++;
else
if(esDigito(s.charAt(i)))
aux = s.charAt(i)+"";
i++;
estado = 1;
else
if(s.charAt(i)=='+')
i++;
estado = 4;
else
if(s.charAt(i)=='-')
i++;
estado = 5;
else
if(s.charAt(i)=='*')
i++;
estado = 6;
else
if(s.charAt(i)=='/')
i++;
estado = 7;
else
if(s.charAt(i)=='^')
{
i++;
estado = 8;
else
if(s.charAt(i)=='(')
i++;
estado = 9;
else
if(s.charAt(i)==')')
i++;
estado = 10;
else
if(s.charAt(i)=='@')
estado = 11;
else
if(s.charAt(i)=='X'|| s.charAt(i)=='x')
estado = 13;
i++;
else
estado = 14;
i+=4;
else
estado = 12;
break;
case 1:
if(esDigito(s.charAt(i)))
i++;
else
if(s.charAt(i)=='.')
i++;
estado = 2;
else //otro
estado = 3;
break;
case 2:
if(esDigito(s.charAt(i)))
i++;
else
estado = 3;
break;
case 3:
listaToken.add(t1);
estado = 0;
break;
case 4:
// filicidades es un token
listaToken.add(t2);
estado = 0;
break;
case 5:
listaToken.add(t3);
estado = 0;
break;
case 6:
listaToken.add(t4);
estado = 0;
break;
case 7:
listaToken.add(t5);
estado = 0;
break;
case 8://^
listaToken.add(t6);
estado = 0;
break;
case 9://( es 3
listaToken.add(t7);
estado = 0;
break;
listaToken.add(t8);
estado = 0;
break;
case 11:
fin = true;
break;
case 12:
error = true;
break;
case 13://x
listaToken.add(t9);
estado = 0;
break;
case 14://raiz
listaToken.add(t10);
estado = 0;
break;
if(error == true)
return listaToken;
return x == '0'||x == '1'||x == '2'||x == '3'||x == '4'||x == '5'||x == '6'||x == '7'||x == '8'||x == '9';
}
public ArrayList<Token> convertirIntijaToPostFija(ArrayList<Token> listaInfija) throws Exception
for(int i = 0;i<listaInfija.size();i++)
Token T = listaInfija.get(i);
if(T.getTipoToken()==2)//operando
lista.add(T);
else
if(T.getTipoToken()==3)//pare abierto
pila.push(T);
else
if(T.getTipoToken()==1)//operador
if(pila.isEmpty() || T.getPrioridad()>pila.peek().getPrioridad())
pila.push(T);
else
//desapilar
while(!pila.isEmpty()&&T.getPrioridad()<=pila.peek().getPrioridad())
lista.add(pila.pop());
pila.push(T);
}
else
//parentesis cerrado
while(!pila.isEmpty()&&pila.peek().getTipoToken()!=3)
lista.add(pila.pop());
if(pila.isEmpty())
else
while(!pila.isEmpty())
lista.add(pila.pop());
return lista;
//--------------function principal
try
for(int i = 0;i<listaPosFija.size();i++)
Token T = listaPosFija.get(i);
if(T.getTipoToken()==2)//operando
pila.push(T.getValor());
else
//operador A - B
if(pila.size()>=2)
double b = pila.pop();
double a = pila.pop();
pila.push(resultado);
else
if(pila.isEmpty()||pila.size()>1)
else
return pila.pop();
catch(Exception E)
try
for(int i = 0;i<listaPosFija.size();i++)
Token T = listaPosFija.get(i);
if(T.getTipoToken()==2)//operando
pila.push(T.getValor());
else
//operador A - B
if(pila.size()>=2)
double b = pila.pop();
double a = pila.pop();
pila.push(resultado);
else
if(pila.isEmpty()||pila.size()>1)
else
return pila.pop();
catch(Exception E)
switch(op)
case 1: return a + b;
case 2: return a - b;
case 3: return a * b;
case 4: return a / b;
return 0;
}
ProyGraficador
FrmGraficador
/*
*/
package proygraficador;
import AnalizadorLexico.Funcion;
import java.awt.Color;
import java.awt.Graphics;
/**
* @author rgc
*/
Graphics g;
int centroEjeX;
int centroEjeY;
int altoPlano;
int anchoPlano;
int escala;
/**
*/
public FrmGraficador() {
initComponents();
g = panelGrafico.getGraphics();
anchoPlano = panelGrafico.getWidth();
altoPlano = panelGrafico.getHeight();
centroEjeX = anchoPlano/2;
centroEjeY = altoPlano/2;
escala = 20;
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
*/
@SuppressWarnings("unchecked")
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText("F(X) =");
txtFuncion.setText("X^2+1");
btnGraficar.setText("Graficar");
btnGraficar.addMouseListener(new java.awt.event.MouseAdapter() {
btnGraficarMouseClicked(evt);
});
javax.swing.GroupLayout panelGraficoLayout = new javax.swing.GroupLayout(panelGrafico);
panelGrafico.setLayout(panelGraficoLayout);
panelGraficoLayout.setHorizontalGroup(
panelGraficoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
);
panelGraficoLayout.setVerticalGroup(
panelGraficoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
);
jButton1.setText("+");
jButton1.addActionListener(new java.awt.event.ActionListener() {
jButton1ActionPerformed(evt);
});
jButton2.setText("-");
jButton2.addActionListener(new java.awt.event.ActionListener() {
jButton2ActionPerformed(evt);
});
jButton3.setText("Up");
jButton3.addActionListener(new java.awt.event.ActionListener() {
jButton3ActionPerformed(evt);
});
jButton4.setText("Down");
jButton4.addActionListener(new java.awt.event.ActionListener() {
jButton4ActionPerformed(evt);
}
});
jButton5.setText("Left");
jButton5.addActionListener(new java.awt.event.ActionListener() {
jButton5ActionPerformed(evt);
});
jButton6.setText("Right");
jButton6.addActionListener(new java.awt.event.ActionListener() {
jButton6ActionPerformed(evt);
});
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(btnGraficar))
.addGroup(layout.createSequentialGroup()
.addComponent(panelGrafico, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton2))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(jButton5, javax.swing.GroupLayout.Alignment.LEADING,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton3, javax.swing.GroupLayout.Alignment.LEADING,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton4, javax.swing.GroupLayout.Alignment.LEADING,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jButton6))))
.addContainerGap(23, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(txtFuncion, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnGraficar))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jButton2))
.addComponent(jButton3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jButton6))
.addComponent(panelGrafico, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(38, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
try
double x = -40;
while(x<40)
try
g.drawLine(xpixel,ypixel,xpixel+1,ypixel);
catch(Exception E2)
//nada
x = x + 0.01;
catch(Exception E)
{
g.setColor(Color.WHITE);
g.fillRect(0,0,anchoPlano, altoPlano);
g.setColor(Color.BLUE);
g.drawLine(0,centroEjeY,anchoPlano,centroEjeY);
g.drawLine(centroEjeX,0,centroEjeX,altoPlano);
int x = centroEjeX;
while(x<anchoPlano)
x = x + escala;
g.setColor(Color.RED);
g.drawLine(x,centroEjeY-5, x, centroEjeY+5);
x = centroEjeX;
while(x>0)
x = x - escala;
g.setColor(Color.RED);
g.drawLine(x,centroEjeY-5, x, centroEjeY+5);
int y = centroEjeY;
while(y>0)
y = y - escala;
g.setColor(Color.RED);
g.drawLine(centroEjeX-5,y,centroEjeX+5,y);
y = centroEjeY;
while(y<altoPlano)
y = y + escala;
g.setColor(Color.RED);
g.drawLine(centroEjeX-5,y,centroEjeX+5,y);
}
}
graficar();
graficarCoordenadas();
graficarFuncion();
escala = escala + 2;
graficar();
if(escala >=3)
escala = escala - 2;
graficar();
//arriba
centroEjeY = centroEjeY-2;
graficar();
}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
centroEjeY = centroEjeY+2;
graficar();
centroEjeX = centroEjeX - 2;
graficar();
centroEjeX = centroEjeX + 2;
graficar();
/**
*/
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
*/
try {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
java.util.logging.Logger.getLogger(FrmGraficador.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
java.util.logging.Logger.getLogger(FrmGraficador.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
java.util.logging.Logger.getLogger(FrmGraficador.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
//</editor-fold>
java.awt.EventQueue.invokeLater(new Runnable() {
new FrmGraficador().setVisible(true);
});
}
Anexo
Ilustración 1 Ejecución de la Aplicación