Código LEX que acepta la string que termina con ‘abb’ sobre el alfabeto de entrada {a,b}

En este artículo, discutiremos el Código LEX que acepta la string que termina con ‘abb’ sobre el alfabeto de entrada {a,b} y veremos la implementación usando el código LEX y comprenderemos el enfoque. Discutámoslo uno por uno. 

Descripción general del problema:
Código LEX que acepta la string que termina en ‘abb’ sobre el alfabeto de entrada {a,b}.

Ejemplo –

Input  : abb
Output : Accepted

Input  : abababb
Output : Accepted

Input  : 23ab
Output : Invalid

Input  : ab345
Output : Invalid

Input  : bbabaa
Output : Not Accepted

Enfoque:
LEX nos proporciona un estado INICIAL por defecto. Entonces, para hacer un DFA, use esto como el estado inicial del DFA. Definimos cuatro estados más: A, B, C y DEAD, donde el estado DEAD se usaría si se encontrara una entrada incorrecta o no válida. Cuando el usuario ingrese un carácter no válido, muévase al estado MUERTO y luego imprima «No válido». Si la string de entrada termina en C, muestra el mensaje «Aceptado». De lo contrario, si la string de entrada termina en el estado INICIAL, A o B, se muestra el mensaje «No aceptado».

Nota:
para compilar el programa lex, necesitamos tener un sistema Unix que tenga flex instalado. Luego necesitamos guardar el archivo con la extensión .l.

Ejemplo – 

filename.l

Luego, después de guardar el programa, cierre el archivo lex y luego abra el terminal y escriba los siguientes comandos de la siguiente manera.

lex filename.l
cc lex.yy.c
./a.out

Implementación- Código LEX:

%{
%}
 
%s A B C DEAD

// not accepted state after visiting A 
%%
<INITIAL>a BEGIN A;
<INITIAL>b BEGIN INITIAL;
<INITIAL>[^ab\n] BEGIN DEAD;
<INITIAL>\n BEGIN INITIAL; {printf("Not Accepted\n");}

// not accepted state after visiting A and B state
<A>a BEGIN A;
<A>b BEGIN B;
<A>[^ab\n] BEGIN DEAD;
<A>\n BEGIN INITIAL; {printf("Not Accepted\n");}
 
// // not accepted state after visiting A and C state  
<B>a BEGIN A;
<B>b BEGIN C;
<B>[^ab\n] BEGIN DEAD;
<B>\n BEGIN INITIAL; {printf("Not Accepted\n");}

// Accepted case
<C>a BEGIN A;
<C>b BEGIN INITIAL;
<C>[^ab\n] BEGIN DEAD;
<C>\n BEGIN INITIAL; {printf("Accepted\n");}

// Invalid Case 
<DEAD>[^\n] BEGIN DEAD;
<DEAD>\n BEGIN INITIAL; {printf("Invalid\n");}
 
%%
// yywrap method
int yywrap()
{
return 1;
}  

// main method 
int main()
{
   printf("Enter String\n");
   // called yylex
   yylex();
return 0;
}

Producción :

Publicación traducida automáticamente

Artículo escrito por kashyapsingh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *