#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char p[30][30];//存放文法
char q[30][30];
int line=0;
int n;
int i,j;
int count=0;
int k,t=0;
int flag=0;
int l,m=0;
char VN[30]={‘\0‘};//存放非终结符号
char VT[30]={‘\0‘};//存放终结符号
printf("请输入规则个数");
scanf("%d",&n);
line=n;
for(i=0;i<30;i++)//给字符串数组p,q全部赋值为‘\0‘
for(j=0;j<30;j++)
{
p[i][j]=‘\0‘;
q[i][j]=‘\0‘;
}
printf("请输入文法:\n");
for(i=0;i<line;i++)
{
scanf("%s",p[i]);
}
//把字符分为终结符和非终结符
l=0;
m=0;
for(i=0;i<line;i++)
{
for(j=0;j<30&&(p[i][j]!=‘\0‘);j++) { //非终结符放入数组VN中
if(p[i][j]<=‘z‘&&p[i][j]>=‘a‘||(p[i][j]<=‘9‘&&p[i][j]>=‘0‘))
{
flag=0;
for(t=0;VN[t]!=‘\0‘;t++)
{
if(VN[t]==p[i][j])
{
flag=1;break;
}
}
if(flag==0)
{
VN[l]=p[i][j];
l++;
}
}
//终结符放在数组VT中
if(p[i][j]<=‘Z‘&&p[i][j]>=‘A‘)
{
flag=0;
for(t=0;t<30&&(VT[t]!=‘\0‘);t++)
{
if(VT[t]==p[i][j])
{
flag=1;
break;
}
}
if(flag==0)
{
VT[m]=p[i][j];
m++;
}
}
}
}
//把规则右部分分离,放入数组q中
count=0;
k=0;
for(i=0;i<line;i++)
{
for(j=4;j<30&&(p[i][j]!=‘\0‘);j++)
{
if((p[i][j]<=‘z‘&&p[i][j]>=‘a‘)||(p[i][j]<=‘Z‘&&p[i][j]>=‘A‘)||(p[i][j]<=‘9‘&&p[i][j]>=‘0‘))
{
q[count][k]=p[i][j];
k++;
}
else
{
count++;
k=0;
}
}
count++;
k=0;
}
//判断是确定的还是非确定的有穷状态自动机,并进行前半部分打印
//判断依据:q数组中每一行字符串是否相同
flag=0;
for(i=0;i<count;i++)
{
for(j=i+1;j<count;j++)
{
if(strcmp(q[i],q[j])==0)
{
flag=1;
break;
}
}
}
if(flag==1)
{
printf("是非确定的有穷状态自动机,即NFA\n\n");
printf("构造的有穷状态自动机为:\n");
printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");
}
else
{
printf("是确定的有穷状态自动机,即DFA\n\n\n");
printf("构造的有穷状态自动机为:\n");
printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");
}
printf("其中,\nK={S");
for(i=0;i<30&&(VT!=‘\0‘);i++)
{
printf(",%c",VT[i]);
}
printf("}\n");
printf("E={");
for(i=0;i<30&&(VN[i]!=‘\0‘);i++)
{
printf("%c ",VN[i]);
}
printf("}\n");
//分离文法
k=0;
count=0;
for(i=0;i<line;i++)
{
j=4;
while(p[i][j]!=‘\0‘)
{
if(k<4)
{
q[count][k]=p[i][k];
k++;
}
else
{
if((p[i][j]<=‘z‘&&p[i][j]>=‘a‘)||(p[i][j]<=‘Z‘&&p[i][j]>=‘A‘)||(p[i][j]<=‘9‘&&p[i][j]>=‘0‘))
{
q[count][k]=p[i][j];
k++;
j++;
}
if(p[i][j]==‘l‘)
{
count++;
k=0;
j++;
}
}
}
count++;
k=0;
}
printf("\n");
//打印M后部分
printf("M:\n");
l=0;
while(VN[l]!=‘\0‘)
{
printf("M(S,%c)={",VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!=‘\0‘);j++)
{
if(VN[l]==q[i][j]&&(q[i][j+1]==‘\0‘)&&(q[i][j-1]==‘=‘))
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
printf("\n");
l=0;k=0;
while(VT[k]!=‘\0‘)
{
l=0;
while(VN[l]!=‘\0‘)
{
printf("M(%c,%c)={",VT[k],VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!=‘\0‘);j++)
{
if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
k++;
printf("\n");
}
system("pause");
}
有限自动机的构造和识别
时间: 2024-10-06 19:52:49
有限自动机的构造和识别的相关文章
实验三有限自动机的构造与识别
#include<stdio.h> #include <ctype.h> #define ok 1 #define error 0 #define MAXREGLUARLONG 40 #define MAXSTATELONG 40 #define MAXCAHRSLONG 40 typedef int state; int iCurrentState=0; //初态以1开始 int iPreState=0; int iLastForkState=0; int iForkState=
第三次实验--有限自动机的构造与识别
实验目的:通过正规式构造NFA(有穷自动机)方法. 所运用到的语法规则: 语句 规则 1.R=? /R=ε X-----ε----->Y 2.R=a X-----a----->Y 3.R=r1r2 A-----r1----->B-----r2----->C 4.R=r1|r2 5.R=r1*
实验三 有限自动机的构造与识别
一.实验目标 1.掌握有穷状态自动机的概念: 2.掌握有穷状态自动机的存储及表示方法: 3.掌握有穷状态自动机与正则式之间的关系. 二.实验要求 1.输入正规式: 2.构造该正规式的有穷状态自动机: 3. 以五元组形式输出. 三.算法 参见教材的转换规则. 练习: 2 (a|b)*abb 2 l(l|d)* 2 1(1010*|1(010)*1)*0 四.完成算法设计.编码和调试工作,完成实验报告. #include<string.h> #include<stdio.h> #
1118有限自动机的构造与识别
1 #include<string.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() 5 { 6 char p[30][30]; 7 char q[30][30]; 8 int line=0; 9 int n; 10 int i,j; 11 int count=0; 12 int k,t=0; 13 int flag=0; 14 int l,m=0; 15 char VN[30]={'\0'}; 16 ch
1210有限自动机的构造与识别
#include<string.h>#include<stdio.h>#include<stdlib.h>int main(){char p[30][30];char q[30][30];int line=0;int n;int i,j;int count=0;int k,t=0;int flag=0;int l,m=0;char VN[30]={'\0'};char VT[30]={'\0'};printf("规则数:");scanf("
1118实验三有限自动机的构造与识别
#include<string.h>#include<stdio.h>#include<stdlib.h>int main(){ char p[30][30]; char q[30][30]; int line=0; int n; int i,j; int count=0; int k,t=0; int flag=0; int l,m=0; char VN[30]={'\0'}; char VT[30]={'\0'}; printf("请输入规则个数:&quo
有限自动机的构造与识别3
#include<stdio.h> #define N 30 char str[N]={NULL}; int st[N]; int t=0,k=0,a,t1=0; struct node//定义一个队列 { char data; struct node * next; }; typedef struct node QueueNode; struct node2//定义一个链队列 { QueueNode *front; QueueNode *rear; }; typedef struct nod
1118 实验三 有限自动机的构造与识别
#include<stdio.h>char gra[80];char ch;int m=0,p=0;struct{ int A; char R[10]; int B;}NFA;main(){ char gra[10]; printf("---------------正规文法转换成有穷自动机------------------\n"); printf("请输入正规文法R:"); do{ ch=getchar(); gra[p++]=ch; }while(c
有限自动机的构造与识别
#include "iostream.h"#include "string.h" #include "fstream.h"#define NULL 0 class TransTile{public: char current; char next; char input; TransTile(char C,char I,char Ne){ current = C; next = Ne; input = I; }}; class DFA{publi