先决条件:设计有限自动机
问题:设计一个LEX代码以构造一个接受该语言的DFA:输入“ 0”和“ 1”上所有以“ 11”结尾的字符串。
例子:
Input: 100011
Output: Accepted
Input: 100101
Output: Not Accepted
Input: asdf
Output: Invalid
方法:
LEX默认为我们提供一个INITIAL状态。因此,为了制作DFA,请将其用作DFA的初始状态。现在我们再定义三个状态A,B和DEAD,如果遇到错误或无效的输入,将使用DEAD状态。当用户输入无效字符,进入DEAD状态并打印消息“ INVALID”,如果输入字符串在状态B结束,则显示消息“ Accepted”。如果输入字符串在状态INITIAL和A处结束,则显示消息“不接受”。
笔记:
要编译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 DEAD
%%
1 BEGIN A;
0 BEGIN INITIAL;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
1 BEGIN B;
0 BEGIN INITIAL;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
1 BEGIN B;
0 BEGIN INITIAL;
[^01\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
int main()
{
printf("Enter String\n");
yylex();
return 0;
}
输出: