LEX代码接受包含输入字母{a,b}的倒数第三个元素'a'的字符串
在本文中,我们将讨论 LEX 代码中的 DFA,它在示例的帮助下接受包含输入字母 {a,b} 的倒数第三个元素“a”的字符串。让我们一对一地讨论它。
先决条件——设计有限自动机
问题概述:
在 LEX 代码中设计一个 DFA,它接受包含输入字母 {a,b} 上倒数第三个元素“a”的字符串。
例子 -
Input : aaab
Output: Accepted
Input : ab
Output: Not Accepted
Input: ababab
Output:Not Accepted
Input:123
Output:Invalid
Input:bbba
Output:Not Accepted
Input:bbbaaab
Output:Accepted
方法 :
LEX 默认为我们提供了一个初始状态。因此,要制作 DFA,请将其用作 DFA 的初始状态。我们定义了另外八种状态:A、B、C、D、E、F、G 和 DEAD,如果遇到错误或无效输入,将使用 DEAD 状态。当用户输入无效字符时,进入 DEAD 状态,并打印信息“Invalid”。如果输入字符串以状态 INITIAL、A、B 或 F 结束,则显示消息“未接受”。否则,如果输入字符串以状态 C、D、E 或 G 结束,则显示其他情况,一条消息“已接受”。
笔记 -
因此,要编译 lex 程序,我们需要一个安装了 flex 的 Unix 系统。然后我们需要用 .l 扩展名保存文件。例如-filename.l然后保存程序后关闭lex文件,然后打开终端,编写如下命令。
lex filename.l
cc lex.yy.c
./a.out
莱克斯代码:
%{
%}
%s A B C D E F G DEAD
%%
b BEGIN INITIAL;
a BEGIN A;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
b BEGIN F;
a BEGIN B;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
b BEGIN D;
a BEGIN C;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
b BEGIN D;
a BEGIN C;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
b BEGIN G;
a BEGIN E;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
b BEGIN F;
a BEGIN B;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
b BEGIN G;
a BEGIN E;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
b BEGIN INITIAL;
a BEGIN A;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
int yywrap()
{
return 1;
}
int main()
{
printf("Enter String\n");
yylex();
return 0;
}
输出 :