在编译原理的实验这个类型的实验是比较简单的,题目要求以及状态图如下
1、在设计的过程中通过while循环对输入的数据进行多次判断,利用switch-case对多个分支进行跳转和利用if-else来判断条件,主函数里利用try-catch进行错误处理,首先执行try中的代码,如果抛出0会由catch去捕获并执行,如果抛出1则catch去捕获会被忽略掉,其中0和1分别代表无法识别正则表达式和可识别正则表达式。
2、对于状态转换路径则是可以利用伪指针和数据进行实现,将转换的路径存放于数组中,利用指针将他们指出并输出出来。
代码如下
#include <iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int i=-1;//控制读入第几个字符
char a[50]="\0";
int sz[1000],clk=0;//利用伪指针指出路径
void DFA_1()
{
int state=0;//state初始值设为0,即从初始状态进行判断
while(1)
{
i++;
switch(state)
{
case 0://输入为数字则跳转到1,其他为错误
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=0;
state=(1);
}
else
{
sz[clk++]=0;
throw 0;
}
break;
case 1://数字是1,‘.’是2,E是4,其他则是8,
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=1;
state=(1);
}
else if(a[i]=='.')
{
sz[clk++]=1;
state=(2);
}
else if(a[i]=='E')
{
sz[clk++]=1;
state=(4);
}
else
{
sz[clk++]=1;
state=(8);
}
break;
case 2://数字是3,其他则是错误
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=2;
state=(3);
}
else
{
sz[clk++]=2;
throw 0;
}
break;
case 3://数字是3,E是4,其他则是9
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=3;
state=(3);
}
else if(a[i]=='E')
{
sz[clk++]=3;
state=(4);
}
else
{
sz[clk++]=3;
state=(9);
}
break;
case 4://+/-是5,数字是6,其他错误
if(a[i]=='+'||a[i]=='-')
{
sz[clk++]=4;
state=(5);
}
else if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=4;
state=(6);
}
else
{
sz[clk++]=4;
throw 0;
}
break;
case 5://数字是6,其他错误
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=5;
state=(6);
}
else
{
sz[clk++]=5;
throw 0;
}
break;
case 6://数字是6,其他是7
if(a[i]>='0'&&a[i]<='9')
{
sz[clk++]=6;
state=(6);
}
else
{
sz[clk++]=6;
state=(7);
}
break;
case 7:
if(a[i]=='\0')
{
sz[clk++]=7;
throw 1;
}
else
{
sz[clk++]=7;
throw 0;
}
break;
case 8:
if(a[i]=='\0')
{
sz[clk++]=8;
throw 1;
}
else
{
sz[clk++]=8;
throw 0;
}
break;
case 9:
if(a[i]=='\0')
{
sz[clk++]=9;
throw 1;
}
else
{
sz[clk++]=9;
throw 0;
}
break;
}
}
}
int main()
{
while(1)
{
memset(sz,0,sizeof(sz));//初始化
clk=0;
memset(a,' ',sizeof(a));
i=-1;//清空指针
cin>>a;//输入正则表达式
try//测试正则表达式
{
DFA_1();
}
catch(int b)//返回0不能识别,返回1可以识别
{
if(b)
{
for(int i=0; i<clk; i++)
cout<<sz[i]<<" ";
cout<<endl;
for(int i=0;i<clk;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"yes"<<endl;
}
else{
for(int i=0; i<clk; i++)
cout<<sz[i]<<" ";
cout<<endl;
for(int i=0;i<clk;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"no"<<endl;
}
}
}
return 0;
}
之后的测试用例以及结果如下