Código LEX para identificar e imprimir constantes enteras y flotantes e identificador

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

Deja una respuesta

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