在输入字母 {a,b} 上接受以 'abb' 结尾的字符串的 LEX 代码
在本文中,我们将讨论在输入字母 {a,b} 上接受以 'abb' 结尾的字符串的 LEX 代码,并将看到使用 LEX 代码的实现并理解该方法。让我们一一讨论。
问题概述:
在输入字母 {a,b} 上接受以 'abb' 结尾的字符串的 LEX 代码。
例子 -
Input : abb
Output : Accepted
Input : abababb
Output : Accepted
Input : 23ab
Output : Invalid
Input : ab345
Output : Invalid
Input : bbabaa
Output : Not Accepted
方法 :
LEX 默认为我们提供了一个初始状态。因此,要制作 DFA,请将其用作 DFA 的初始状态。我们定义了另外四种状态:A、B、C 和 DEAD,如果遇到错误或无效输入,将使用 DEAD 状态。当用户输入无效字符时,进入 DEAD 状态,然后打印“Invalid”。如果输入字符串以 C 结尾,则显示消息“已接受”。否则,如果输入字符串以状态 INITIAL、A 或 B 结束,则显示消息“未接受”。
笔记 -
要编译 lex 程序,我们需要一个安装了 flex 的 Unix 系统。然后我们需要用 .l 扩展名保存文件。
例子 -
filename.l
然后保存程序后关闭 lex 文件,然后打开终端并编写以下命令,如下所示。
lex filename.l
cc lex.yy.c
./a.out
实施 - LEX 代码:
%{
%}
%s A B C DEAD
// not accepted state after visiting A
%%
a BEGIN A;
b BEGIN INITIAL;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
// not accepted state after visiting A and B state
a BEGIN A;
b BEGIN B;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
// // not accepted state after visiting A and C state
a BEGIN A;
b BEGIN C;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Not Accepted\n");}
// Accepted case
a BEGIN A;
b BEGIN INITIAL;
[^ab\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Accepted\n");}
// Invalid Case
[^\n] BEGIN DEAD;
\n BEGIN INITIAL; {printf("Invalid\n");}
%%
// yywrap method
int yywrap()
{
return 1;
}
// main method
int main()
{
printf("Enter String\n");
// called yylex
yylex();
return 0;
}
输出 :