编译原理NFA转化为DFA

使用列表法对文法进行转化将这个表作为程序的输入。输入样例为P117第六题。

#include<bits/stdc++.h>
using namespace std;
struct GRAM
{
    //$代表空 
    string a;
    string b;
    string c;

};
int main()
{
    int num,len;
    GRAM gram[100];
    int time=0,n,n1;
    //
    cout<<"请输入图结构(以#结束):"<<endl;
    for(len=0;len<100;len++)
    {
        cin>>gram[len].a;
        if(gram[len].a=="#")
            break;
        else
        {
            cin>>gram[len].b;
            cin>>gram[len].c;
        }
    }
    num=len; 
     //初始化 
     GRAM dfa[100];
     dfa[0].a=gram[0].a;
     /*dfa[0].b=gram[0].b;
     dfa[0].c=gram[0].c;*/
     //填表 
     time++;
     for(int i=0;i<100;i++)
     {
        for(int j=0;j<dfa[i].a.length();j++)
        {
                //添加b 
            for(int k=0;k<num;k++)
            {
                if(dfa[i].a[j]==gram[k].a[0])
                {
                    if(gram[k].b!="$")
                    {
                        dfa[i].b+=gram[k].b;
                    }
                    else
                        dfa[i].b+="";

                } 
             }
             //去除相同的字母 
            string ustr(dfa[i].b);
            sort(ustr.begin(), ustr.end());
            ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
            dfa[i].b=ustr;
        }
        //cout<<    dfa[i].b<<endl;
        for(n=0;n<time;n++)
        {
            if(dfa[i].b==dfa[n].a)
            {
                break;
             }

        }
        if(n==time)
        {
            dfa[time].a=dfa[i].b;

            time++;
        //cout<<time<<"添加B"<<endl;
        }
        //添加c 
        for(int j=0;j<dfa[i].a.length();j++)
        {
            for(int k=0;k<num;k++)
            {
                if(dfa[i].a[j]==gram[k].a[0])
                {
                    if(gram[k].c!="$")
                    {
                        dfa[i].c+=gram[k].c;
                    }
                    else
                        dfa[i].c+="";

                 } 


            }
            //去除相同的字母 
            string ustr(dfa[i].c);
            sort(ustr.begin(), ustr.end());
            ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
            dfa[i].c=ustr;       
        }
        //cout<<dfa[i].c<<endl;
        for(n1=0;n1<time;n1++)
        {
            if(dfa[i].c==dfa[n1].a)
            {
                break;
             }

        }

        if(n1==time)
        {
            //cout<<i+1<<endl;
            dfa[time].a=dfa[i].c;
            time++;
            //cout<<time<<"添加C"<<endl;
        }

    }
     //cout<<time<<endl; 
     cout<<"NFA-->DFA:"<<endl;
     for(int i=0;i<time-1;i++)
     {
         cout<<dfa[i].a<<"  "<<dfa[i].b<<"  "<<dfa[i].c<<endl;
     }
     cout<<"最后图中的状态为:"<<endl;
     /*int f;
    for(int i=0;i<time;i++)
     {

         if(dfa[i].a.find('Z') !=string::npos)
         {
            dfa[i].a="Z";
         }
         for(f=0;f<i;f++)
         {
            if(dfa[i].a==dfa[f].a)
            {
                break;
             }
         }
         if(f==i)
         {
            cout<<dfa[i].a<<endl;
         }
         else
         {
            continue;
         }

     }*/
     for(int i=0;i<time-1;i++)
     {
         cout<<dfa[i].a<<endl; 
     } 

}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yangyangcome/article/details/80313333