改进后的NFA(没有括号的情况)

#include<stdio.h>
#define  MAX 1000
void lianjie(int s,int e,int n ,char input[]);
int p=2;
main()
{
	char input[MAX];
	long i=0;
	long n;
	char getinput;
	printf("input:");
	do
	{
		getinput=getchar();
        input[i]=getinput;
        i++;
	}while(getinput!='#');
	n=i;
	nfa(0,1,0,n-2,input);
	printf("\n");
	printf("%d",n);
	printf("\n");
}
void nfa(int start,int end ,int s,int e,char input[])
{
    if(s==e)
    {
        if(input[s+1]=='#'||input[s+1]=='|')
        {
            printf("f(%d,%c)=1\n",start,input[s]);
        }
        else
        {
            printf("f(%d,%c)=%d\n",start,input[s],end);
            p++;
        }
    }
    else{
        int k=findlow(s,e,input);
        if(input[k]=='|')
        {
            nfa(start,end,s,k-1,input);
            nfa(start,end,k+1,e,input);

        }
        else if(input[k]=='.')
        {
            nfa(start,p,s,k-1,input);
            nfa(p-1,p,k+1,e,input);
        }
        else if(input[k]=='*')
        {
            printf("f(%d,~)=%d\n",start,p);
            printf("f(%d,%c)=%d\n",p,input[k-1],p);
            if(input[s+2]=='#'||input[s+2]=='|')
            {
                printf("f(%d,~)=1\n",p);
            }
            else
            {
                p++;
                printf("f(%d,~)=%d\n",p-1,p);
            }
            p++;
        }
    }
}
int findlow(int s,int e ,char input[])
{
    int i=s;
    int k=i;
    int weight=0;
    while(i<=e)
    {
        if(input[i]=='|'&&weight<3)
        {
            k=i;
            weight=3;
        }
        else if(input[i]=='.'&&weight<2)
        {
            k=i;
            weight=2;
        }
        else if(input[i]=='*'&&weight<1)
        {
            k=i;
            weight=1;
        }
        i++;
    }
    return k;
}

 

posted @ 2016-12-22 19:57  183区展伯  阅读(98)  评论(0编辑  收藏  举报