En este artículo, analizaremos el DFA en código LEX que acepta una string que contiene el penúltimo elemento ‘a’ sobre el alfabeto de entrada {a, b} con la ayuda de un ejemplo. Discutámoslo uno a uno.
Requisito previo: diseño de autómatas finitos
Descripción general del problema:
diseñe un DFA en código LEX que acepte una string que contenga el penúltimo elemento ‘a’ sobre el alfabeto de entrada {a, b}.
Ejemplo –
Input : aaab Output: Accepted Input : ab Output: Not Accepted Input: ababab Output:Not Accepted Input:123 Output:Invalid Input:bbba Output:Not Accepted Input:bbbaaab Output:Accepted
Enfoque:
LEX nos proporciona un estado INICIAL por defecto. Entonces, para hacer un DFA , use esto como el estado inicial del DFA . Definimos ocho estados más: A, B, C, D, E, F, G y DEAD, donde el estado DEAD se usaría si se encontrara una entrada incorrecta o no válida. Cuando el usuario ingresa un carácter no válido, pasa al estado MUERTO y el mensaje de impresión «No válido». Si la string de entrada termina en el estado INICIAL, A, B o F, se muestra el mensaje «No aceptado». De lo contrario, si la string de entrada termina en el estado C, D, E o G, se muestra el mensaje «Aceptado».
Nota:
para compilar el programa lex, necesitamos tener un sistema Unix que tenga flex instalado. Luego, debemos guardar el archivo con la extensión .l. Por ejemplo , filename.l Luego, después de guardar el programa, cierra el archivo lex y luego abre el terminal y escribe los siguientes comandos de la siguiente manera.
lex filename.l cc lex.yy.c ./a.out
Código LEX:
%{ %} %s A B C D E F G DEAD %% <INITIAL>b BEGIN INITIAL; <INITIAL>a BEGIN A; <INITIAL>[^ab\n] BEGIN DEAD; <INITIAL>\n BEGIN INITIAL; {printf("Not Accepted\n");} <A>b BEGIN F; <A>a BEGIN B; <A>[^ab\n] BEGIN DEAD; <A>\n BEGIN INITIAL; {printf("Not Accepted\n");} <B>b BEGIN D; <B>a BEGIN C; <B>[^ab\n] BEGIN DEAD; <B>\n BEGIN INITIAL; {printf("Not Accepted\n");} <C>b BEGIN D; <C>a BEGIN C; <C>[^ab\n] BEGIN DEAD; <C>\n BEGIN INITIAL; {printf("Accepted\n");} <D>b BEGIN G; <D>a BEGIN E; <D>[^ab\n] BEGIN DEAD; <D>\n BEGIN INITIAL; {printf("Accepted\n");} <E>b BEGIN F; <E>a BEGIN B; <E>[^ab\n] BEGIN DEAD; <E>\n BEGIN INITIAL; {printf("Accepted\n");} <F>b BEGIN G; <F>a BEGIN E; <F>[^ab\n] BEGIN DEAD; <F>\n BEGIN INITIAL; {printf("Not Accepted\n");} <G>b BEGIN INITIAL; <G>a BEGIN A; <G>[^ab\n] BEGIN DEAD; <G>\n BEGIN INITIAL; {printf("Accepted\n");} <DEAD>[^\n] BEGIN DEAD; <DEAD>\n BEGIN INITIAL; {printf("Invalid\n");} %% int yywrap() { return 1; } int main() { printf("Enter String\n"); 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