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

     #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.

    三、        实验总结

  • 相关阅读:
    Django ORM 之F、Q查询与事务
    Django ORM 之基于对象、双下划线查询
    Django ORM
    Django 模板层
    Django视图层
    Django 路由控制
    Django完成常用四大功能
    Django 框架之前
    HTTP协议
    CSS-学习笔记五
  • 原文地址:https://www.cnblogs.com/piglet00/p/6102520.html
Copyright © 2011-2022 走看看