Está en la página 1de 22

Lenguajes y Compiladores

Automata De Pila

Profesor: Carlos A. Ruiz De La Cruz Melo Correo:zorroculto69@hotmail.com

AUTOMATA DE PILA(AP)
Definicin
Autmata que extiende la potencia reconocedora de lenguajes del autmata finito aadiendo una memoria interna tipo pila (contador de simbolos). El funcionamiento del AP se realiza de acuerdo con alguna forma de gramtica.

PILA
Push(3) 3 Push(5) 5 3 Push(1) 1 5 3 Pop 5 3 Pop 3 Push(2) 2 3

AP
Definicin formal Septupla AP={ E, 7, 7p, H, I0, P0, F }
E
7 7p H I 0 E

: : : : :

conjunto finito de estados alfabeto del sistema alfabeto de la pila funcin de transicin estado inicial estado inicial de la pila conjunto de estados finales

P0 7 p : F E :

AP
Configuracin de un AP
(Ii , w, a) Donde: Ii : estado actual del AP w :Subcadena por analizar en el instante T a :Contenido de la pila en el instante T

Observacin:
w y a pueden ser la secuencia P Si w = P no hay nada mas por analizar Si a = P la pila no tiene nada, esta vaca

AP
Movimiento en un AP Transicin entre dos configuraciones (Ii , aw, pa) (Ij , w, ua)

Movimiento vlido si (Ij , u) H(Ii , a, p) Donde: Ii , Ij E a 7 {P} w 7* u 7p

TIPOS DE AP
Autmata de Pila determinista (APD) Cuando estando en una configuracin se pasa solo a otra configuracin. Autmata de Pila no determinista (APN) Cuando a partir de una configuracin puede pasarse a una o mas configuraciones

SECUENCIA ACEPTADA
Configuracin inicial (I0 , w, P0) w7 Configuracin final (If , P, a) If F a 7p* Un AP acepta una secuencia w si puede llegarse de la configuracin inicial a la configuracin final: (I0 , w, P0) * (If , P, a)

LENGUAJE ACEPTADO
El lenguaje es aceptado por el AP cuando se llega al estado final que se denota por:

L(AP)={ w 7*/ (I0 , w, P0) * (If , P, a), If F }

Ejemplo 1
Construimos un AP : AP={ E, 7, 7p, H, I0, P0, F } E
7 7p

x, P; x

= = =

{ I0 } { x, y } {x} estado inicial estado inicial de la pila { I0 }

I0
y, x ; P

I0 E :

x 7p : F =

1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )

push pop

Ejemplo 1
1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )
x, P; x push pop

I0
y, x ; P

a) (I0 , xy, P) 1 (I0 , y, x) 2 (I0 , P, P)

b)

(I0 , yxyx, x) 2 (I0 , xyx, P) 1 (I0 , yx, x) 2 (I0 , x, P) 1 (I0 , P, x)

c)

(I0 , yxx, x) 2 (I0 , xx, P) 1 (I0 , x, x) 1 (I0 , P, xx)

Ejemplo 1
Secuencia que no pertenece al lenguaje (I0 , xyyx, P) 1 (I0 , yyx, x) 2 (I0 , yx, P) ?

push

x, P; x

I0
pop y, x ; P

1.(I0 , x, P ; I0 , x ) 2.(I0 , y, x ; I0 , P )

Observacion
No existe transicin alguna para poder continuar y aceptar la secuencia como parte del lenguaje.

Ejemplo 1
Observacin El AP es un APD ya que para cada configuracin solo existe una transicin y nada mas que una hacia otra configuracin.

autopila2

Ejemplo 1
Programa
class ARREGLO{ char vector[100]; char pila[100]; int i,tope; public: ARREGLO(char m[]){ tope=100;strcpy(pila,m);i=strlen(pila);} bool OCUPADO(){ if (i>=tope) return true; else return false; } bool VACIO(){ if(i<=0) return true; else return false; } void METER(char a){ char t[2]; t[0]=a;t[1]='\0'; strcat(pila,t); i=strlen(pila); } char SACAR(){ char a; int k=strlen(pila); a=pila[k-1]; pila[k-1]='\0'; i=strlen(pila); return a; }

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

Ejemplo 2
Construir un AP que reconosca el siguiente lenguaje:

L(G)={7 ={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
Construimos el AP : AP={ E, 7, 7p, H, I0, P0, F }
E
7 7p

P,x;P

x, P;x

x,x;P

= = =

{ I0 } { x, y } { x, y } estado inicial estado inicial de la pila { I2 }

I0
y,P;y

I1
P,y;P

I2
y,y;P

I 0 E : P 7p :

1.(I0 , x, P ; I1 , x ) 2.(I0 , y, P ; I1 , y ) 3.(I1 , P, x ; I1 , P ) 4.(I1 , P, y ; I1 , P ) 5.(I1 , x, x ; I2 , P ) 6.(I1 , y, y ; I2 , P )

push push pop pop pop pop

Ejemplo 2
En (a) y (b) el AP reconoce las secuencias, sin embargo no ocurre lo mismo en (c). 1.(I0 , x, P ; I1 , x ) 2.(I0 , y, P ; I1 , y ) 3.(I1 , P, x ; I1 , P ) 4.(I1 , P, y ; I1 , P ) 5.(I1 , x, x ; I2 , P ) 6.(I1 , y, y ; I2 , P ) a) (I0 , xx, P) 1 (I1 , x, x) 5 (I2 , P, P) b) (I0 , yy, P) 2 (I1 , y, y) 6 (I2 , P, P) x, P;x

P,x;P

x,x;P

I0
y,P;y

I1
P,y;P

I2
y,y;P

c) (I0 , xxyy, P) 1 (I1 , xyy, x) 3 (I1 , xyy, P)

Ejemplo 2
Observacin El AP es un APN x, P;x

P,x;P

x,x;P

I0
y,P;y

I1
P,y;P

I2
y,y;P

(I0 , xx, P) 1 Se llega a un estado de aceptacin (I1 , x, x) 5 3 (I1 , x, P)

1.(I0 , x, P ; I1 , x ) 2.(I0 , y, P ; I1 , y ) 3.(I1 , P, x ; I1 , P ) 4.(I1 , P, y ; I1 , P ) 5.(I1 , x, x ; I2 , P ) 6.(I1 , y, y ; I2 , P )

(I2 , P, P) No se puede continuar

autopila

Ejemplo 2
Programa
class ARREGLO{ char vector[100]; char pila[100]; int i,tope; public: ARREGLO(char m[]){ tope=100;strcpy(pila,m); i=strlen(pila);} bool OCUPADO(){ if (i>=tope) return true; else return false; } bool VACIO(){ if(i<=0) return true; else return false; } void METER(char a){ char t[2]; t[0]=a;t[1]='\0'; strcat(pila,t); i=strlen(pila); } char SACAR(){ char a; int k=strlen(pila); a=pila[k-1]; pila[k-1]='\0'; i=strlen(pila); return a; }

bool reconocedor(char x[]){ strcpy(vector,x); int e=0; int j=0; char temp; while(j<strlen(vector) && e!=2){ switch(e){ case 0: if(vector[j]=='x' ){ e=1; METER('x'); } else if(vector[j]=='y' ){ e=1; METER('y'); } else e=3; break; case 1:if(!VACIO()){ temp=SACAR(); if( temp=='x'){ if(vector[j]=='x') e=2; else {e=1; j--;} } else if( temp=='y'){ if(vector[j]=='y')e=2; else {e=1; j--;} } else e=3; }else e=3; break; } j++; }//fin de while if(e==2 && (j==strlen(vector)) ) return true; else return false; } }; int main(){ char cadena[100]; char pila[100]; cout<<"\n INGRESE CADENA A RECONOCER: ";cin>>cadena; cout<<"\n INGRESE PILA : ";cin>>pila; if(!strcmp(pila,"v")) strcpy(pila,""); ARREGLO tira(pila); if(tira.reconocedor(cadena)) 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


1.(I0 , a, Z ; I0 , AZ ) 2.(I0 , a, A ; I0 , AA ) 3.(I0 , b, A ; I1 , P ) 4.(I1 , b, A ; I1 , P ) 5.(I1 , P, Z ; I2 , P )

= {a, b}.
push push pop pop pop

a, Z;AZ b,A; P

b,A;P
P,Z;P

I0
a,A;AA

I1

I2

autopila3

Ejemplo 3
a, Z;AZ 1.(I0 , a, Z ; I0 , AZ ) 2.(I0 , a, A ; I0 , AA ) 3.(I0 , b, A ; I1 , P ) 4.(I1 , b, A ; I1 , P ) 5.(I1 , P, Z ; I2 , P )
push push pop pop pop

b,A;P b,A; P
P,Z;P

I0
a,A;AA

I1

I2

RECONOCER: cadena pila Cadena Pila cadena pila ab P b Z Z AZ P

ab
estado Estado estado 0 1 2

a b I0 I1

P I2

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

Ejercicios
Escriba el autmata de pila y su programa para los siguientes lenguajes

1. 2. 3. 4.

L={ancbm | n,m>0}. L={anbm | n { m, n,m>0}. L={anbm | n { m, n,m0}. L = {aibjck | i, j>0 y k=i+j}

El programa puede ser en java o C++

También podría gustarte