Vous êtes sur la page 1sur 22

Lenguajes y Compiladores

Automata De Pila

Profesor: Carlos A. Ruiz De La Cruz Melo


Correo:zorroculto69@hotmail.com
AUTOMATA DE PILA(AP)
Definición

 Autómata que extiende la potencia reconocedora de lenguajes


del autómata finito añadiendo una memoria interna tipo pila
(“contador de simbolos”).

 El funcionamiento del AP se realiza de acuerdo con alguna


forma de gramática.

PILA
Push(3) Push(5) Push(1) Pop Pop Push(2)
1
5 5 5 2
3 3 3 3 3 3
AP
Definición formal
Septupla AP={ E, , p, , 0, P0, F }

E : conjunto finito de estados

 : alfabeto del sistema

p : alfabeto de la pila

 : función de transición

0 E : estado inicial

P0  p : estado inicial de la pila

F E : conjunto de estados finales


AP
Configuración de un AP

(i , w, a)

Donde:
i : estado actual del AP
w :Subcadena por analizar en el instante T
a :Contenido de la pila en el instante T

Observación:

 w y a pueden ser la secuencia 


 Si w =  no hay nada mas por analizar
 Si a =  la pila no tiene nada, esta vacía
AP
Movimiento en un AP

Transición entre dos configuraciones

(i , aw, pa)  (j , w, ua)

Movimiento válido si (j , u)  (i , a, p)


Donde:
i , j E a    {}
w  * u  p
TIPOS DE AP
 Autómata de Pila determinista (APD)
Cuando estando en una configuración se pasa solo a otra
configuración.

 Autómata de Pila no determinista (APN)


Cuando a partir de una configuración puede pasarse a una o
mas configuraciones
SECUENCIA ACEPTADA
Configuración inicial (0 , w, P0) w
Configuración final (f , , a) f F a  p*

Un AP acepta una secuencia w si puede llegarse de la


configuración inicial a la configuración final:

(0 , w, P0) * (f , , a)


LENGUAJE ACEPTADO

El lenguaje es aceptado por el AP cuando se llega al


estado final que se denota por:

L(AP)={ w  */ (0 , w, P0) * (f , , a), f F }


Ejemplo 1 x, ; x

Construimos un AP :
AP={ E, , p, , 0, P0, F }

E = { 0 }
0
 = { x, y }
p = {x}
0 E : estado inicial y, x ; 
x  p : estado inicial de la pila
F = { 0 }

1.(0 , x,  ; 0 , x ) push

2.(0 , y, x ; 0 ,  ) pop
Ejemplo 1
1.(0 , x,  ; 0 , x ) push

pop
2.(0 , y, x ; 0 ,  )

x, ; x

a) (0 , xy, ) b) (0 , yxyx, x) c) (0 , yxx, x)


0 1 2 2
(0 , y, x) (0 , xyx, ) (0 , xx, )
2 1 1
(0 , , ) (0 , yx, x) (0 , x, x)
y, x ;  2 1
(0 , , xx)
(0 , x, )
1
(0 , , x)
x, ; x
Ejemplo 1
push

Secuencia que no pertenece al


lenguaje
0
(0 , xyyx, )
1
(0 , yyx, x)
pop y, x ; 
2
(0 , yx, )

?
1.(0 , x,  ; 0 , x )
Observacion 2.(0 , y, x ; 0 ,  )
No existe transición alguna para poder
continuar y aceptar la secuencia como
parte del lenguaje.
Ejemplo 1
Observación

El AP es un APD ya que para cada


configuración solo existe una transición y
nada mas que una hacia otra
configuración.

autopila2
Ejemplo 1 bool reconocedor(char x[]){
strcpy(vector,x);
int e=0;
int j=0;
char temp;

Programa
while(j<strlen(vector)){
switch(e){
case 0:
if(vector[j]=='x'){
METER('x');
class ARREGLO{ }
char vector[100]; else {
char pila[100]; if(!VACIO()){
int i,tope; temp=SACAR();
public: if(vector[j]=='y' && temp=='x'){ ;}
ARREGLO(char m[]){ tope=100;strcpy(pila,m);i=strlen(pila);} else e=3;
bool OCUPADO(){ }
if (i>=tope) else e=3;
return true; }
else return false; break;
} }
bool VACIO(){ j++;
if(i<=0) return true; }//fin de while
else return false; if(e==0) return true;
} else return false;
}
void METER(char a){ };
char t[2]; int main(){
t[0]=a;t[1]='\0'; char cadena[100];
strcat(pila,t); char pila[100];
i=strlen(pila); cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena;
} cout<<"\n INGRESE PILA : ";cin>>pila;
char SACAR(){ if(!strcmp(pila,"v")) strcpy(pila,"");
char a; ARREGLO tira(pila);
int k=strlen(pila); if(tira.reconocedor(cadena))
a=pila[k-1]; cout<<"\n verdadero";
pila[k-1]='\0'; else cout<<"\n falso";
i=strlen(pila); getch();
return a; }
}
Ejemplo 2

Construir un AP que reconosca el siguiente lenguaje:

L(G)={ ={x, y} / w=xn  w=yn donde n=2 }

Secuencias reconocidas por el lenguaje:


yy, xx

Secuencias no reconocidas:
x, y, yyxx, xyyx , xyyxx
Ejemplo 2 ,x;
Construimos el AP : x,x;
x, ;x
AP={ E, , p, , 0, P0, F }
1 2
E = { 0 } 0
 = { x, y } y,;y y,y;
p = { x, y } ,y;
0 E : estado inicial
  p : estado inicial de la pila
F = { 2 }
1.(0 , x,  ; 1 , x ) push

2.(0 , y,  ; 1 , y ) push

3.(1 , , x ; 1 ,  ) pop

4.(1 , , y ; 1 ,  ) pop
pop
5.(1 , x, x ; 2 ,  )
pop
6.(1 , y, y ; 2 ,  )
Ejemplo 2
,x;

x, ;x x,x;

2
En (a) y (b) el AP reconoce las
secuencias, sin embargo no
ocurre lo mismo en (c). 0 1
y,;y y,y;
1.(0 , x,  ; 1 , x )
,y;
2.(0 , y,  ; 1 , y )
3.(1 , , x ; 1 ,  )
4.(1 , , y ; 1 ,  )
5.(1 , x, x ; 2 ,  )
6.(1 , y, y ; 2 ,  )
a) (0 , xx, ) b) (0 , yy, ) c) (0 , xxyy, )
1 2 1
(1 , x, x) (1 , y, y) (1 , xyy, x)
5 6 3
(2 , , ) (2 , , ) (1 , xyy, )

?
Ejemplo 2 ,x;

x, ;x x,x;
Observación
1 2
El AP es un APN 0
y,;y y,y;
,y;

1.(0 , x,  ; 1 , x )
2.(0 , y,  ; 1 , y )
(0 , xx, )
3.(1 , , x ; 1 ,  )
1
4.(1 , , y ; 1 ,  )
Se llega a un (1 , x, x)
estado de 5.(1 , x, x ; 2 ,  )
5 3
aceptación 6.(1 , y, y ; 2 ,  )

(2 , , ) (1 , x, )

No se puede continuar

autopila
Ejemplo 2 bool reconocedor(char x[]){
strcpy(vector,x);
char temp;
int e=0; int j=0;

while(j<strlen(vector) && e!=2){


switch(e){
case 0:
if(vector[j]=='x' ){ e=1; METER('x'); }
Programa else if(vector[j]=='y' ){ e=1; METER('y'); }
else e=3;
break;
class ARREGLO{ case 1:if(!VACIO()){
char vector[100]; temp=SACAR();
char pila[100]; if( temp=='x'){
int i,tope; if(vector[j]=='x') e=2;
public: else {e=1; j--;}
ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);} }
bool OCUPADO(){ else if( temp=='y'){
if (i>=tope) if(vector[j]=='y')e=2;
return true; else {e=1; j--;}
else return false; }
} else e=3;
bool VACIO(){ }else e=3;
if(i<=0) return true; break;
else return false; }
} j++;
}//fin de while
void METER(char a){ if(e==2 && (j==strlen(vector)) ) return true;
char t[2]; else return false;
t[0]=a;t[1]='\0'; }
strcat(pila,t); };
i=strlen(pila); int main(){
} char cadena[100];
char SACAR(){ char pila[100];
char a; cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena;
int k=strlen(pila); cout<<"\n INGRESE PILA : ";cin>>pila;
a=pila[k-1]; if(!strcmp(pila,"v")) strcpy(pila,"");
pila[k-1]='\0'; ARREGLO tira(pila);
i=strlen(pila); if(tira.reconocedor(cadena))
return a; cout<<"\n verdadero";
} else cout<<"\n falso";
getch();
}
Ejemplo 3
Construir el automata de pila a partir del siguiente lenguaje

Sea L = {a nb n : n>=0} sobre Σ= {a, b}.

1.(0 , a, Z ; 0 , AZ ) push b,A;


a, Z;AZ
2.(0 , a, A ; 0 , AA ) push ,Z;
b,A; 
2
3.(0 , b, A ; 1 ,  ) pop

4.(1 , b, A ; 1 ,  ) pop
0 1
5.(1 , , Z ; 2 ,  ) pop

a,A;AA

autopila3
Ejemplo 3
b,A;
a, Z;AZ
,Z;
b,A; 
1.(0 , a, Z ; 0 , AZ ) push
1 2
2.(0 , a, A ; 0 , AA ) push
pop
0
3.(0 , b, A ; 1 ,  )
4.(1 , b, A ; 1 ,  ) pop
pop a,A;AA
5.(1 , , Z ; 2 ,  )

RECONOCER: ab
a 
cadena
Cadena
cadena pila
Pila
pila estado
Estado
estado b
1 2
b
ab 
Z
Z
AZ 012 0
Ejemplo 3 bool reconocedor(char x[]){
strcpy(vector,x);
int e=0;
int j=0;
programa char temp;
while(j<=strlen(vector)){
switch(e){
case 0:if(!VACIO()){
temp=SACAR();
class ARREGLO{
if(vector[j]=='a' && temp=='Z'){ e=0; METER('Z'); METER('A'); }
char vector[100];
else if(vector[j]=='a' && temp=='A' ){ e=0; METER('A');METER('A'); }
char pila[100];
else if(vector[j]=='b' && temp=='A' ) e=1;
int i,tope;
else e=3;
public:
}else e=3;
ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);}
break;
bool OCUPADO(){
case 1:if(!VACIO()){
if (i>=tope)
temp=SACAR();
return true;
if( vector[j]=='b' && temp=='A') e=1;
else return false;
else if( vector[j]=='\0' && temp=='Z' ){ e=2;METER('Z'); }
}
else e=3;
bool VACIO(){
}else e=3;
if(i<=0) return true;
break;
else return false;
}
}
j++;
}//fin de while
void METER(char a){
if(e==2 ) return true;
char t[2];
else return false;
t[0]=a;t[1]='\0';
}
strcat(pila,t);
};
i=strlen(pila);
int main(){
}
char cadena[100];
char SACAR(){
cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena;
char a;
ARREGLO tira("Z");
int k=strlen(pila);
if(tira.reconocedor(cadena)) cout<<"\n verdadero";
a=pila[k-1];
else cout<<"\n falso";
pila[k-1]='\0';
getch();
i=strlen(pila);
}
return a;
}
Ejercicios

Escriba el autómata de pila y su programa para los siguientes lenguajes

1.L={ancbm | n,m>0}.
2.L={anbm | n  m, n,m>0}.
3.L={anbm | n  m, n,m≥0}.
4.L = {aibjck | i, j>0 y k=i+j}

El programa puede ser en java o C++

Vous aimerez peut-être aussi