首页 > 代码库 > 实验三

实验三

#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. 技术分享技术分享

实验三