En este artículo, discutiremos cómo puede resolver el problema, y también verá cómo puede diseñar problemas relacionados con DFA en código LEX para identificar e imprimir constantes e identificadores enteros y flotantes. Discutámoslo uno por uno.
Descripción general del problema:
diseñe un DFA en código LEX para identificar e imprimir constantes e identificadores enteros y flotantes.
Nota:
la expresión regular para entero, flotante e identificador es la siguiente.
Integer - [0-9]+ Float - [0-9]+[.][0-9]+ Identifier - [A-Za-z_][A-Za-z0-9_]+
Ejemplo –
Input : 35 Output : Integer Input : 3.98 Output : Float Input : kashyap Output : Identifier Input : 123Singh Output : Invalid
Enfoque:
LEX nos proporciona un estado INICIAL por defecto. Entonces, para hacer un DFA, use este estado inicial como el estado inicial del DFA. Defina cuatro estados más A, B, C y DEAD. DEAD es el estado muerto que se usaría si se encuentra una entrada no válida o incorrecta y se imprime «No válido». A se usa cuando se encuentra un número entero, que imprime «Entero» y B se usa cuando se encuentra una constante flotante que imprime «Flotante» y C se usa cuando se encuentra un identificador, que imprime «Identificador». Un carácter de nueva línea (\n) marca el final de la entrada, por lo que la transición al estado INICIAL e imprime la salida o imprime «No aceptado» o «No válido».
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.
lex filename.l cc lex.yy.c ./a.out
Método 1
Código LEX –
C
// Declaration Section %{ %} %s A B C DEAD // Declaring states // Rules Section %% <INITIAL>[0-9]+ BEGIN A; <INITIAL>[0-9]+[.][0-9]+ BEGIN B; <INITIAL>[A-Za-z_][A-Za-z0-9_]* BEGIN C; <INITIAL>[^\n] BEGIN DEAD; <INITIAL>\n BEGIN INITIAL; {printf("Not Accepted\n");} <A>[^\n] BEGIN DEAD; <A>\n BEGIN INITIAL; {printf("Integer\n");} <B>[^\n] BEGIN DEAD; <B>\n BEGIN INITIAL; {printf("Float\n");} <C>[^\n] BEGIN DEAD; <C>\n BEGIN INITIAL; {printf("Identifier\n");} <DEAD>[^\n] BEGIN DEAD; <DEAD>\n BEGIN INITIAL; {printf("Invalid\n");} %% // Auxillary Functions int yywrap() { return 1; } int main() { printf("Enter String\n"); yylex(); return 0; }
Producción :
Método 2
Si también desea imprimir los tokens identificados, puede aplicar el siguiente código Lex para imprimir el número entero, flotante e identificador coincidentes.
Código LEX-
C
//Declaration Section %{ #include<stdlib.h> int num_int; // stores integer char *str; // stores identifier double num_float; // stores float %} %s A B C DEAD //Declaring States //Rules Section %% <INITIAL> [0-9]+ BEGIN A; {num_int = atoi(yytext);} <INITIAL> [0-9]+"."[0-9]+ BEGIN B; {num_float = atof(yytext);} <INITIAL> [a-zA-Z_][a-zA-Z0-9_]* BEGIN C; {str = yytext;} <INITIAL> [^\n] BEGIN DEAD; <INITIAL> [\n] BEGIN INITIAL; {printf("Not Accepted\n");} <A> [^\n] BEGIN DEAD; <A> \n BEGIN INITIAL; {printf("%d Integer Accepted\n", num_int);} <B> [^\n] BEGIN DEAD; <B> \n BEGIN INITIAL; {printf("%lf Float Accepted\n", num_float);} <C> [^\n] BEGIN DEAD; <C> \n BEGIN INITIAL; {printf("%sIdentifier Accepted\n", str);} <DEAD> [^\n] BEGIN DEAD; <DEAD> \n BEGIN INITIAL; {printf("Invalid\n");} %% //Auxillary Functions 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