实验三 有限自动机的构造与识别

实验三 有限自动机的构造与识别

 

一、实验目标
  
1、掌握有穷状态自动机的概念;  
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。
 
二、实验要求
  
1、输入正规式; 

2、构造该正规式的有穷状态自动机;

3. 以五元组形式输出。

三、算法

参见教材的转换规则。

练习:

²  (a|b)*abb

²  l(l|d)*

²  1(1010*|1(010)*1)*0

 

四、完成算法设计、编码和调试工作,完成实验报告。

 

#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("\t请输入规则个数:"); 
  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("\t请输入文法:\n");
for(i = 0; i < line; i++)  {printf("\t");scanf("\t%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==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("\t是非确定的有穷状态自动机,即 NFA\n\n");
  printf("\t构造的有穷状态自动机为: \n");
  printf("\tNFA  N= ( K ,∑, M , {S} , {Z} ) \n");}
  else{printf("\t是确定的有穷状态自动机,即 DFA\n\n\n");
  printf("\t构造的有穷状态自动机为: \n");
  printf("\tDFA  D= ( K ,∑, M , {S} , {Z} ) \n");}
  printf("\t其中:\n\tK={S");
  for(i=0;i<30&&(VT[i]!='\0');i++){printf(" , %c",VT[i]);}
  printf("}\n");printf("\t∑ ={");
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]=='|'){count++;k=0;j++;}
}
}
count++;k=0;
}
printf("\n");printf("\tM:\n");l=0;
while(VN[l]!='\0')
{
printf("\tM(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("\tM(%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");

}

 

转载于:https://www.cnblogs.com/a305810827/p/6102495.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一名称 词法分析程序(2学时) 实验目的 理解词法分析在编译程序中的作用;加深对有穷自动机模型的理解; 掌握词法分析程序的实现方法和技术。 实验内容 选择部分C语言的语法成分,设计其词法分析程序,要求能够识别关键字、运算符、分界符、标识符、常量(至少是整型常量,可以自己扩充识别其他常量)等,并能处理注释、部分复合运算符(如>=等)。单词以二元式形式输出、输出有词法错误的单词及所在行号。 实验要求 (1)待分析的简单的语法 关键字:begin if then while do end … 运算符和界符::= + - * / < <= > >= <> = == ; ( ) # , … 其他单词是标识符id和整型常数num,通过以下正规式定义: id=l(l|d)* (l:letter d:digit) num=dd* 空格、注释:在词法分析中要去掉。 (2)各种单词符号对应的种别编码(参考这张表,可以不同) (3)待分析的源程序: (a)int main() { int a=1,b=2; b/a; /* 注释部分*/ b>a; c=a+b; cout<<c; return 0; } (b)这个待分析程序有词法错误(选做) while ((a+15)>0) { if (2x = = 7) i3=z; } 实验二名称 预测分析程序(2学时) 实验目的 掌握LL(1)文法分析思想;掌握预测分析程序的构造方法。 实验内容 设计及实现能够识别表达式的预测分析程序。 实验要求 (1)总体要求: 1) 根据文法手工或程序方式构造预测分析表; 2) 采用程序方式构造预测分析表时,需计算First()和Follow()集合,有一定难度; 3) 根据预测分析表,设计并实现预测分析总控程序,完成自上而下的语法分析器。 (2)文法的定义(可以选择此文法,也可以自己选择其他文法) (3)给出当输入串为:(i1+i2)*(i3+i4)的分析过程。(输出分析过程中的栈,输入串和利用的产生式等信息)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值