实验三 有限自动机的构造与识别

实验三 有限自动机的构造与识别

 

一、实验目标
  
1、掌握有穷状态自动机的概念;  
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。
 
二、实验要求
  
1、输入正规式; 

2、构造该正规式的有穷状态自动机;

3. 以五元组形式输出。

三、算法

参见教材的转换规则。

 

练习:

²  (a|b)*abb

²  l(l|d)*

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

 

四、完成算法设计、编码和调试工作,完成实验报告。

源代码:

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

void main()

{

    char p[30][30];

    char q[30][30];

    int line=0;

    int n;

    int i,j;

    int count=0;

    int k,t=0;

    int flag=0;

    int l,m=0;

    char VN[30]={'\0'};

    char VT[30]={'\0'};

    printf("规则数:");

    scanf("%d",&n);

    line=n;

    for(i=0;i<30;i++)

        for(j=0;j<30;j++)

        {

            p[i][j]='\0';

            q[i][j]='\0';

        }

        printf("请输入文法:\n");

        for(i=0;i<line;i++)

        {

            scanf("%s",p[i]);

        }

       

        l=0;

        m=0;

        for(i=0;i<line;i++)

        {

            for(j=0;j<30&&(p[i][j]!='\0');j++)

            {

               

                if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))

                {

                    flag=0;

                    for(t=0;VN[t]!='\0';t++)

                    {

                        if(VN[t]==p[i][j])

                        {

                            flag=1;break;

                        }

                    }

                    if(flag==0)

                    {

                        VN[l]=p[i][j];

                        l++;

                    }

                }

               

                if(p[i][j]<='Z'&&p[i][j]>='A')

                {

                    flag=0;

                    for(t=0;t<30&&(VT[t]!='\0');t++)

                    {

                        if(VT[t]==p[i][j])

                        {

                            flag=1;

                            break;

                        }

                    }

                    if(flag==0)

                    {

                        VT[m]=p[i][j];

                        m++;

                    }

                }

            }

        }

       

        count=0;

        k=0;

        for(i=0;i<line;i++)

        {

            for(j=4;j<30&&(p[i][j]!='\0');j++)

            {

                if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))

                {

                    q[count][k]=p[i][j];

                    k++;

                }

                else

                {

                    count++;

                    k=0;

                }

            }

            count++;

            k=0;

        }

        flag=0;

        for(i=0;i<count;i++)

        {

            for(j=i+1;j<count;j++)

            {

                if(strcmp(q[i],q[j])==0)

                {

                    flag=1;

                    break;

                }

            }

        }

        if(flag==1)

        {

            printf("是非确定的有穷状态自动机,即NFA\n\n");

            printf("构造的有穷状态自动机为:\n");

            printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");

        }

        else

        {

            printf("是确定的有穷状态自动机,即DFA\n\n\n");

            printf("构造的有穷状态自动机为:\n");

            printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");

        }

        printf("其中,\nK={S");

        for(i=0;i<30&&(VT!='\0');i++)

        {

            printf(",%c",VT[i]);

        }

        printf("}\n");

        printf("E={");

        for(i=0;i<30&&(VN[i]!='\0');i++)

        {

            printf("%c ",VN[i]);

        }

        printf("}\n");

       

        k=0;

        count=0;

        for(i=0;i<line;i++)

        {

            j=4;

            while(p[i][j]!='\0')

            {

                if(k<4)

                {

                    q[count][k]=p[i][k];

                    k++;

                }

                else

                {

                    if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))

                    {

                        q[count][k]=p[i][j];

                        k++;

                        j++;

                    }

                    if(p[i][j]=='l')

                    {

                        count++;

                        k=0;

                        j++;

                    }

                }

            }

            count++;

            k=0;

        }

        printf("\n");

       

        printf("M:\n");

        l=0;

        while(VN[l]!='\0')

        {

            printf("M(S,%c)={",VN[l]);

            for(i=0;i<30;i++)

            {

                for(j=4;j<30&&(q[i][j]!='\0');j++)

                {

                    if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))

                        printf("%c",q[i][0]);

                }

            }

            printf("}\t");

            l++;

        }

        printf("\n");

        l=0;k=0;

        while(VT[k]!='\0')

        {

            l=0;

            while(VN[l]!='\0')

            {

                printf("M(%c,%c)={",VT[k],VN[l]);

                for(i=0;i<30;i++)

                {

                    for(j=4;j<30&&(q[i][j]!='\0');j++)

                    {

                        if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])

                            printf("%c",q[i][0]);

                    }

                }

                printf("}\t");

                l++;

            }

            k++;

            printf("\n");

        }

        system("pause");

}

调试分析:

转载于:https://www.cnblogs.com/god1924668503/p/6126388.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。 2熟悉PASCAL系统中的基本语句及文件类型的使用方法。 3掌握PL/O语言源程序的结构及构成规则。 (二)实验内容与步骤  1用PL/0语言编写程序:建立和访问正文文件 2用PL/O语言编写能打印如下图形的程序 * * * * * * * * * * * * * * * * * * * * * * * * * 3用PL/O语言编写求3~100之间全部素数的程序。 4 将一正数倒置。 5 对任意给定的整数,列出其二进制、八进制、十六进制表示形式。 6深刻理解源程序、目标程序、编译程序的概念。 7用EBNF描述PL/O语言的程序结构及构成规则。 注:  实验构造识别符号串的自动机 (一)实验目的: 1掌握形式语言与自动机的概念 2了解正规集及有穷自动机的关系 3能构造识别相应符号串的自动机 4能构造词法分析程序所识别的各类单词的自动机 (二)实验步骤及内容: 1用高级语言编写程序:该程序能接受所有的标识符。 2用高级语言编写程序:该程序能接受所有的常数(整数和定点小数)。 3用高级语言编写程序:该程序能接受PL/0的所有保留字。 4 用高级语言编写程序:该程序能接受PL/0的所有界符、运算符。 (三)有关说明:  1高级及语言可选择 C语言实现。 2以上各程序要求:对输入的任意符号串能给出接受与否的识别信息。 实验三 词法分析程序的构造 (一)实验目的 1掌握PL/O编译程序的使用方法 2掌握PL/O编译程序的总体结构 3掌握PL/O编译程序的词法分析程序 4改编总控程序和词法分析程序 (二)实验内容及步骤 1单词的分类: 可将所有标识符归为一类;将常数归为另一类:保留字、界符、运算符符则可采取一词一类。 2符号表的建立 可事先建立一保留字表,以备识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。 3单词串的输出形式: 所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该常数(整数)的二进制形式)。对于保留字、界符和运算符,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。(或:为便于查看由词法分析程序输出的单词串也可以在CLASS字段上放置单词符号串本身)。 4编写上述词法分析程序 (三)有关说明:  1该词法分析程序只能识别用PL/O语言书写的简单程序。 2也可改编PL/O的编译程序中的词法分析程序,使之能识别含repeat语句的程序。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值