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

 #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=0;
int iMaxState=0;
char cRegluarSting[MAXREGLUARLONG];       //输入的正规式字符串
char cCharSet[MAXCAHRSLONG];              //字符集
int  iStateMatrix[MAXSTATELONG][MAXCAHRSLONG];  //状态转换矩阵
state vStoreRegluarSting()//把字符串读入一个缓冲区中
{
    scanf("%s",cRegluarSting);
    return ok;
}
state vPreProcessRegluarSting()
//对字符串进行预处理,去掉字符串里面的对分析不产生影响
{
    int i=0;
    while(cRegluarSting[i]!=‘\0‘)
    {
        if(cRegluarSting[i]==‘*‘)
        {
            int j=i+1;
            while(cRegluarSting[j-1]!=‘\0‘)
            {
                cRegluarSting[j-1]=cRegluarSting[j++];
            }
        }
        i++;
    }
    return ok;
}
void vConstructStateMatrix(char cChar,int istate)//构造状态转换矩阵
{
    int i;
    for(i=0;cCharSet[i]!=‘\0‘;i++)
        if(cChar==cCharSet[i])
            break;
    cCharSet[i]=cChar;
    iStateMatrix[iPreState][i]=istate;
}
void vAanalyseRegluarSting()//对字符串进行从左到右的分析与处理
{
    int i=0;
    for(i=0;cRegluarSting[i]!=0;i++)
    {
        if(cRegluarSting[i]==‘(‘)  //NFA出现开始分叉情况
        {
            int iTheFirstl=0;
            int iCharNumBeforl=0;
            iForkState=iCurrentState;
            while(cRegluarSting[i]!=‘)‘)
            {
                i++;
                if(isalpha(cRegluarSting[i]))
                {
                    if(cRegluarSting[i+1]==‘)‘)
                        iCurrentState=iLastForkState;
                    else
                    iCurrentState++;
                    iCharNumBeforl++;                    vConstructStateMatrix(cRegluarSting[i],iCurrentState);
                    iPreState=iCurrentState;
                    if(iCurrentState>iMaxState)
                        iMaxState=iCurrentState;
                }
                if(cRegluarSting[i]==‘|‘)
                    {
                        iPreState=iForkState;
                        if(iTheFirstl==0)
                        {
                            iLastForkState=iCurrentState;
                            iTheFirstl++;
                        }
                        if(iCharNumBeforl==1&&cRegluarSting[i+2]==‘|‘)
                            iCurrentState=iForkState;
                        iCharNumBeforl=0;
                    }
                if(cRegluarSting[i]==‘)‘)
                {
                    iPreState=iForkState=iLastForkState;
                    iCurrentState=iMaxState;
                }
            }
        }
        else
            {
                if(isalpha(cRegluarSting[i]))
                    {
                        iCurrentState++;                        vConstructStateMatrix(cRegluarSting[i],iCurrentState);
                        iPreState=iCurrentState;
                        if(iCurrentState>iMaxState)
                            iMaxState=iCurrentState;
                    }
            }
    }
}
void  vPrintfStateProjectFunction()
{
    int icCharSetPointer;
    int iPreStatePointer;
    for
(iPreStatePointer=0;iPreStatePointer<MAXSTATELONG;iPreStatePointer++)
    for(icCharSetPointer=0;icCharSetPointer<MAXSTATELONG;icCharSetPointer++)
           if(iStateMatrix[iPreStatePointer][icCharSetPointer]>0)       printf("&(%d,%c)=%d\n",iPreStatePointer,cCharSet[icCharSetPointer],iStateMatrix[iPreStatePointer][icCharSetPointer]);
}
void vPrintfNfa()//输出NFA
{
    int iStateNumble;
    int i=0;
    printf("NFA的形式为:(S,$,&,S0,F)\n\n以下为NFA的具体集合内容:\n\n");
    printf("字符集$为:{");
    while(cCharSet[i]!=0)
        if(cCharSet[i+1]==0)
            printf("%c",cCharSet[i++]);
        else
            printf("%c,",cCharSet[i++]);
    printf("}\n");
    printf("\n状态集S为:{");
    for (i=0;i<=iMaxState;i++) {
        if(i==iMaxState)
            printf("%d",i);
        else
            printf("%d,",i);
    }
    printf("}\n\n");
    vPrintfStateProjectFunction();
    printf("\n初态集S0为:{0}\n\n");
    printf("终态集F为:{%d}",iMaxState);
}
void main()
{
    vStoreRegluarSting();
    vPreProcessRegluarSting();
    vAanalyseRegluarSting();
    vPrintfNfa();
}

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

一、        实验目的

1、掌握有穷状态自动机的概念;  
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。
 
实验内容和要求

1、输入正规式;

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

3. 以五元组形式输出。

练习:

2  (a|b)*abb

2  l(l|d)*

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

 

二、        实验方法、步骤及结果测试

 

  1. 1.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

3

4.

三、        实验总结

时间: 2024-12-26 12:36:44

实验三有限自动机的构造与识别的相关文章

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

一.实验目标 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实验三有限自动机的构造与识别

#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

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 <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] =

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

实验目的:通过正规式构造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*          

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("规则数:");scanf(&quo

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("规则数:");

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("