先决条件:设计有限自动机
问题:设计一个LEX代码以构造一个接受以下语言的DFA:输入“ 0”和“ 1”上所有奇数为0且偶数为1的字符串。
例子:
Input: 10001
Output: Accepted
Input: 10011
Output: Not Accepted
Input: asdf
Output: Invalid
方法:
LEX默认为我们提供一个INITIAL状态。因此,为了制作DFA,请将其用作DFA的初始状态。现在我们再定义四个状态A,B,C和DEAD,如果遇到错误或无效的输入,将使用DEAD状态。当用户输入无效字符,进入DEAD状态并打印消息“ INVALID”,如果输入字符串在状态B结束,则显示消息“ Accepted”。如果输入字符串以状态INITIAL结尾,则A,C然后显示消息“未接受”。 (请参阅此处)。
笔记:
要编译lex程序,用户需要UNIX系统和flex,可以使用sudo apt-get install flex安装它。使用上述所有规范,打开unix终端并执行以下操作:
- 使用lex程序将规范文件更改为C语言程序。生成的程序在lex.yy.c文件中。
- 使用带有-ll标志的cc命令来编译程序并将其与LEX子例程库链接。生成的可执行程序在a.out文件中。
lex lextest
cc lex.yy.c -lfl
LEX代码:
%{
%}
%s A B C DEAD
%%
1 BEGIN A;
0 BEGIN B;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not 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("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;
}
输出: