LEX代码中的DFA,它接受偶数个零和偶数个1
Lex 是一个生成词法分析器的计算机程序,通常与 YACC 解析器生成器一起使用。 Lex 最初由 Mike Lesk 和 Eric Schmidt 编写并于 1975 年描述,是许多 Unix 系统上的标准词法分析器生成器,并且等效工具被指定为 POSIX 标准的一部分。 Lex 读取指定词法分析器的输入流并输出以 C 编程语言实现词法分析器的源代码。
确定性有限接受器 –
在计算理论中,作为理论计算机科学的一个分支,确定性有限自动机 (DFA)——也称为确定性有限接受器 (DFA) 和确定性有限状态机 (DFSM)——是一种有限状态机,它接受和拒绝符号字符串,并且只为每个输入字符串生成自动机的唯一计算(或运行)。确定性是指计算的唯一性。为了寻找捕获有限状态机的最简单模型,McCulloch 和 Pitts 是最早在 1943 年引入类似于有限自动机概念的研究人员之一。
方法 -
LEX 默认为我们提供了一个初始状态。所以要制作一个DFA,使用这个初始状态作为DFA的初始状态。定义另外两个状态A 和 B ,其中 B 是在遇到错误或无效输入时将使用的死状态。当用户得到无效输入时,移动到状态 B 并打印消息“INVALID”,如果用户从状态 A 到达 INITIAL 状态并带有“\n”,则显示消息“Not Accepted”。但是如果用户在初始状态上得到一个\n,用户会显示一条消息“Accepted”。
例子 -
Input : 1001
Output : Accepted
Input : hjabdba
Output : INVALID
要实现上述 DFA,用户需要将以下代码写入扩展名为 .l 的 lex 文件中。
笔记 :
To compile a lex program, user need a UNIX system and flex which can be installed using sudo apt-get install flex
With all the above specification open unix terminal and do the following:
1. Use the lex program to change the specification file into a C language program. The resulting program is in the lex.yy.c file.
2. Use the cc command with the -ll flag to compile and link the program with a library of lex subroutines. The resulting executable program is in the a.out file.
代码 -
C++
lex lextest
cc lex.yy.c -lfl
输出 -
%{
%}
%s A B
%%
1 BEGIN INITIAL;
0 BEGIN A;
[^0|\n] BEGIN B;
\n BEGIN INITIAL; printf("Accepted\n");
1 BEGIN A;
0 BEGIN INITIAL;
[^0|\n] BEGIN B;
\n BEGIN INITIAL; printf("Not Accepted\n");
0 BEGIN B;
1 BEGIN B;
[^0|\n] BEGIN B;
\n {BEGIN INITIAL; printf("INVALID\n");}
%%
void main()
{
yylex();
}
方法2:-
方法:-
LEX 默认为我们提供了一个初始状态。因此,要制作 DFA,请将其用作 DFA 的初始状态。我们定义了另外四种状态:A、B、C 和 DEAD,如果遇到错误或无效输入,则使用 DEAD 状态。当用户输入无效字符时,进入 DEAD 状态并打印消息“INVALID”,如果输入字符串以状态 INITIAL 结束,则显示消息“Accepted”。如果输入字符串以状态 A、B、C 结束,则显示消息“未接受”。
法典:-
nickhil@NICKHIL:~$ lex prpg11.l
nickhil@NICKHIL:~$ cc lex.yy.c -lfl
nickhil@NICKHIL:~$ ./a.out
1000
Not Accepted
hello
INVALID
01010101
Accepted
输出:-
%{
%}
%s A B C DEAD
%%
1 BEGIN A;
0 BEGIN B;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
1 BEGIN INITIAL;
0 BEGIN C;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
1 BEGIN C;
0 BEGIN INITIAL;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
1 BEGIN B;
0 BEGIN A;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
int main()
{
printf("Enter String\n");
yylex();
return 0;
}