• 构造该正规式的有穷状态自动机


    #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]!='')
        {
            if(cRegluarSting[i]=='*')
            {
                int j=i+1;
                while(cRegluarSting[j-1]!='')
                { 
                    cRegluarSting[j-1]=cRegluarSting[j++];    
                }
            }
            i++;
        }
        return ok;
    }
    void vConstructStateMatrix(char cChar,int istate)//构造状态转换矩阵
    {
        int i;
        for(i=0;cCharSet[i]!='';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
    ",iPreStatePointer,cCharSet[icCharSetPointer],iStateMatrix[iPreStatePointer][icCharSetPointer]);    
    }
    void vPrintfNfa()//输出NFA
    {
        int iStateNumble;
        int i=0;
        printf("NFA的形式为:(S,$,&,S0,F)
    
    以下为NFA的具体集合内容:
    
    ");
        printf("字符集$为:{");
        while(cCharSet[i]!=0)
            if(cCharSet[i+1]==0)
                printf("%c",cCharSet[i++]);
            else
                printf("%c,",cCharSet[i++]);
        printf("}
    ");
        printf("
    状态集S为:{");
        for (i=0;i<=iMaxState;i++) {
            if(i==iMaxState)
                printf("%d",i);
            else
                printf("%d,",i);
        }
        printf("}
    
    ");
        vPrintfStateProjectFunction();
        printf("
    初态集S0为:{0}
    
    ");
        printf("终态集F为:{%d}",iMaxState);
    }
    void main()
    {
        vStoreRegluarSting();
        vPreProcessRegluarSting();
        vAanalyseRegluarSting();
        vPrintfNfa();   
    }
    

      

  • 相关阅读:
    EclipseTool_v1.0.4(eclipse整合开发工具)
    51单片机堆栈深入剖析
    3.进程
    解决卡巴斯基安装失败的一个方法.
    9.串口操作之API篇 ReadFile WriteFile CloseHandle 及总结
    2.内核对象之<创建和关闭内核对象,跨进程共享>
    1.内核对象之<什么是内核对象,使用计数及安全性>
    TeeChart使用小技巧之 点击Series显示名称
    TeeChart使用小技巧之 曲线分页显示,轴分别显示日期
    8.串口操作之API篇 PurgeComm ClearCommError
  • 原文地址:https://www.cnblogs.com/zlcan/p/5051778.html
Copyright © 2020-2023  润新知