用于识别和打印整数和浮点常量和标识符的 LEX 代码
在本文中,我们将讨论如何解决该问题,您还将了解如何在 LEX 代码中设计与 DFA 相关的问题,以识别和打印整数和浮点常量和标识符。让我们一一讨论。
问题概述:
在 LEX 代码中设计一个 DFA 来识别和打印整数和浮点常量和标识符。
笔记 -
整数、浮点数和标识符的正则表达式如下。
Integer - [0-9]+
Float - [0-9]+[.][0-9]+
Identifier - [A-Za-z_][A-Za-z0-9_]+
例子 -
Input : 35
Output : Integer
Input : 3.98
Output : Float
Input : kashyap
Output : Identifier
Input : 123Singh
Output : Invalid
方法 :
LEX 默认为我们提供了一个初始状态。所以要制作一个DFA,使用这个初始状态作为DFA的初始状态。再定义四个状态 A、B、C 和 DEAD。 DEAD 是在遇到无效或错误输入时使用的死状态,它会打印“Invalid”。当遇到一个整数时使用 A,它打印“Integer”,当遇到一个浮动常量时使用 B,它打印“Float”,当遇到标识符时使用 C,它打印“Identifier”。字符(\n) 标记输入的结束,因此转换到 INITIAL 状态并打印输出或打印“未接受”或“无效”。
笔记:-
要编译 lex 程序,我们需要一个安装了 flex 的 Unix 系统。然后我们需要用 .l 扩展名保存文件。例如-filename.l然后保存程序后关闭 lex 文件,然后打开终端并编写以下命令。
lex filename.l
cc lex.yy.c
./a.out
方法一
LEX 代码 –
C
// Declaration Section
%{
%}
%s A B C DEAD // Declaring states
// Rules Section
%%
[0-9]+ BEGIN A;
[0-9]+[.][0-9]+ BEGIN B;
[A-Za-z_][A-Za-z0-9_]* BEGIN C;
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Integer\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Float\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Identifier\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
// Auxillary Functions
int yywrap()
{
return 1;
}
int main()
{
printf("Enter String\n");
yylex();
return 0;
}
C
//Declaration Section
%{
#include
int num_int; // stores integer
char *str; // stores identifier
double num_float; // stores float
%}
%s A B C DEAD //Declaring States
//Rules Section
%%
[0-9]+ BEGIN A; {num_int = atoi(yytext);}
[0-9]+"."[0-9]+ BEGIN B; {num_float = atof(yytext);}
[a-zA-Z_][a-zA-Z0-9_]* BEGIN C; {str = yytext;}
[^\n] BEGIN DEAD;
[\n] BEGIN INITIAL; {printf("Not Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%d Integer Accepted\n", num_int);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%lf Float Accepted\n", num_float);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%sIdentifier Accepted\n", str);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
//Auxillary Functions
int yywrap()
{
return 1;
}
int main(){
printf("Enter String:\n");
yylex();
return 0;
}
输出 :
方法二
如果您还想打印已识别的标记,则可以应用以下 Lex 代码来打印匹配的整数、浮点数和标识符。
LEX代码-
C
//Declaration Section
%{
#include
int num_int; // stores integer
char *str; // stores identifier
double num_float; // stores float
%}
%s A B C DEAD //Declaring States
//Rules Section
%%
[0-9]+ BEGIN A; {num_int = atoi(yytext);}
[0-9]+"."[0-9]+ BEGIN B; {num_float = atof(yytext);}
[a-zA-Z_][a-zA-Z0-9_]* BEGIN C; {str = yytext;}
[^\n] BEGIN DEAD;
[\n] BEGIN INITIAL; {printf("Not Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%d Integer Accepted\n", num_int);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%lf Float Accepted\n", num_float);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("%sIdentifier Accepted\n", str);}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
//Auxillary Functions
int yywrap()
{
return 1;
}
int main(){
printf("Enter String:\n");
yylex();
return 0;
}
输出: