#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. 以五元组形式输出。

练习:

²  (a|b)*abb

²  l(l|d)*

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

 

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

 

  1. 1.      运行结果及分析

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

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

3

4.

三、        实验总结