zoukankan      html  css  js  c++  java
  • 1118 实验三 有限自动机的构造与识别

    #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();
    }

  • 相关阅读:
    【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
    【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】
    【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
    IMemoryBufferReference and IMemoryBufferByteAccess
    SoftwareBitmap and BitmapEncoder in Windows.Graphics.Imaging Namespace
    Windows UPnP APIs
    编译Android技术总结
    Windows函数转发器
    Two Ways in Delphi to Get IP Address on Android
    Delphi Call getifaddrs and freeifaddrs on Android
  • 原文地址:https://www.cnblogs.com/xinmingwang/p/5051808.html
Copyright © 2011-2022 走看看