天天看点

有穷自动机

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

int 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(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')

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

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

                            flag=1;

                            break;

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

                        m++;

            }

        count=0;

        k=0;

            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("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]);

        //分离文法

            j=4;

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

                if(k<4)

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

                    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;

        printf("\n");

        //打印

        printf("M:\n");

        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++;

        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");

}