词法分析----------(未实现,鬼知道哪里写错了,Tina啊,算了明天再看)

代码:

#include<iostream>
#include<fstream>
#include<cstring>
#include<stack>
using namespace std;
ifstream  input;
ofstream  output;
struct group{
    char node[100];
    int count;
};//状态集
group trans[200][200]; //转换矩阵,trans[i][j]=k;状态i输入j转换到状态K;
int groupCount;//DFA状态个数
group DFA[100];//DFA状态;
int trans_DFA[100][100];//DFA转换矩阵;
int finalFlag[200]; //DFA终态标志数组
char begin;     //初态 S
char end;       //终态
char state[100];//文法中的状态集合
int sCount=0;   //文法中状态的个数
char final[200];//文法中终结符集合
int fCount=0;   //文法中终结符的个数;

/*char keyword[60][20]={"int","float","char","double","bool","string","struct",
"stack","if","else","for","while","include","iostream","main","return","switch","typedef","void","unsigned","using","namespace","std","ifstream","ofstream"};
char one_operator[20]={'+','-','*','/','!','%','~','&','|','^','='};*/
bool check_state(char a){
    for(int i=0;i<sCount;i++){
        if(a==state[i])return true;
    }
    return false;
}
bool check_final(char a){
    for(int i=0;i<fCount;i++){
        if(a==final[i]) return true;
    }
    return false;
}
void NFA(){
    int num;//文法个数
    int flag;//文法类型:0为右线性,1为左线性;
    char lag[6];//文法产生式
    input.open("词法分析_文法.txt");
    input>>num;
    input>>flag;
    input>>lag;
    if(flag==1){
      state[sCount++]='S';
      begin='S';
      end=lag[0];
    }
    else{
      state[sCount++]='Y';
      begin=lag[0];
      end='Y';    
    }
    while(num--){
        if(!check_state(lag[0])){
            state[sCount++]=lag[0];
        }
        if(strlen(lag)==3){//  A->#的情况 空用#代替
            if(flag==1){
                trans[begin]['#'].node [trans[begin]['#'].count ++]=lag[0];
            }
            else{
                trans[lag[0]]['#'].node [trans[lag[0]]['#'].count ++]='Y';
            }
        }
        if(strlen(lag)==4){//A->a的情况
            if(!check_final(lag[3])){
              final[fCount++]=lag[3];
            }
            if(flag==0)//右线性
            trans[lag[0]][lag[3]].node [trans[lag[0]][lag[3]].count ++]='Y';
            if(flag==1)//左线性
            trans[begin][lag[3]].node [trans[begin][lag[3]].count ++]=lag[0];    
        }
        if(strlen(lag)==5){      //A->Aa或A->aA 的情况
            if(!check_final(lag[3])&&(lag[3]<='A'||lag[3]>='Z')){
               final[fCount++]=lag[3];
            }
            if(!check_final(lag[4])&&(lag[4]<='A'||lag[4]>='Z')){
               final[fCount++]=lag[4];
            }
            if(flag==1){
                trans[lag[3]][lag[4]].node [trans[lag[3]][lag[4]].count ++]=lag[0];
            }
            if(flag==0){
                trans[lag[0]][lag[3]].node [trans[lag[0]][lag[3]].count ++]=lag[4];
            }
        }
        input>>lag;
    }     
}
void showNFA()
{
    for(int i=0;i<100;++i)
    {
        for(int j=0;j<100;++j)
        {
            for(int k=0;k<100;++k)
            {
                if(trans[i][j].node[k]!='@')
                    cout<<char(i)<<" "<<char(j)<<" "<<k<<" "<<trans[i][j].node[k]<<endl;
            }
        }
    }
}


//子集构造法
//检查状态a是否在状态集合T中
bool checkGroup(char a,group t){
    for(int i=0;i<t.count ;i++){
        if(a==t.node [i])return true;
    }
    return false;
}
//闭包
void closure(group &t){
    for(int i=0;i<t.count ;i++){
        for(int j=0;j<trans[t.node [i]]['#'].count ;j++){
            if(!checkGroup(trans[t.node [i]]['#'].node [j],t)){
                t.node [t.count ++]=trans[t.node [i]]['#'].node [j];
            }
        }
    }
}
//检查是否是终态
bool checkFinal(group t){
    for(int i=0;i<t.count ;i++){
        if(t.node [i]==end)return true;
    }
    return false;
}
//检查状态t是否在 DFA的状态集合里面
int checkNewsta(group t){
    bool p[200];
    bool pp;
    for(int i=0;i<t.count ;i++)p[i]=false;
    for(int i=0;i<groupCount;i++){
        if(t.count !=DFA[i].count ){
            continue;
        }
        for(int j=0;j<t.count ;j++){
            for(int k=0;k<DFA[i].count ;k++){
                if(t.node [j]==DFA[i].node [k]){
                    p[j]=true;
                    break;
                }
            }
        }
        pp=true;
        for(int r=0;r<t.count ;r++){
            if(p[r]==false){
                pp=false;
                break;
            }
        }
        if(pp=true)   return i;
    for(int r=0;r<t.count ;r++)p[r]=false;
    }
    return -1;
}
void child_method(){
    groupCount=0;//DFA状态个数
    group  newsta;//扩展之后的状态集合
    group  oldsta;//原来的状态集合;
    oldsta.count =0;
    newsta.node [newsta.count ++]=begin;
    closure(newsta);
    stack<group> s;
    s.push(newsta);
    DFA[groupCount++]=newsta;
    if(checkFinal(newsta)){
        finalFlag[groupCount-1]=true;
    }
    while(!s.empty() ){
        
    //    cout<<"while循环:::groupCount:           "<<groupCount<<endl;
        
        newsta=s.top() ;
        s.pop() ;
        for(int i=0;i<fCount;i++){
            for(int j=0;j<newsta.count ;j++){
                for(int k=0;k<trans[newsta.node [j]][final[i]].count ;k++){
                    if(trans[newsta.node [j]][final[i]].node [k]!='@'&&!checkGroup(trans[newsta.node [j]][final[i]].node [k],oldsta)){
                        oldsta.node [oldsta.count ++]=trans[newsta.node [j]][final[i]].node [k];
                    }
                }
            }
            closure(oldsta);
            /*cout<<"odsta的状态集:"<<endl;
            for(int h=0;h<oldsta.count ;h++){
                cout<<oldsta.node [h]<<" ";
            }
            cout<<endl;*/
            cout<<"oldsta.count:"<<oldsta.count <<endl;
            cout<<" checkNewsta(oldsta):"<< checkNewsta(oldsta)<<endl;
            
            
            if(oldsta.count >0&& checkNewsta(oldsta)==-1 ){
                
                cout<<"push之前::::groupCount:           "<<groupCount<<endl;
                
                trans_DFA[groupCount-1][final[i]]=groupCount;
                s.push(oldsta);
                
                cout<<"odsta的状态集:"<<endl;
                for(int h=0;h<oldsta.count ;h++){
                    cout<<oldsta.node [h]<<" ";
                }
                cout<<endl;
                
                DFA[groupCount++]=oldsta;
                if(checkFinal(oldsta)){
                  finalFlag[groupCount-1]=true;    
                }
            }
            if(oldsta.count >0&& checkNewsta(oldsta)!=-1&&final[i]!='#'){
                trans_DFA[checkNewsta(newsta)][final[i]]=checkNewsta(oldsta);
            }
            oldsta.count =0;
            
        /*    for(int m=0;m<oldsta.count ;m++){
                oldsta.node [m]='@';
            }*/
            
        }
    }
}
void showGroup(){
    for(int i=0;i<groupCount;i++){
        cout<<i<<"的集合:";
        for(int j=0;j<DFA[i].count;j++){
            cout<<DFA[i].node [j]<<" ";
        }
        cout<<endl;
    }
}
void showDFAtrans(){
    for(int i=0;i<100;++i)
    {
        for(int j=0;j<100;++j)
        {
            for(int k=0;k<100;++k)
            {
                if(trans_DFA[i][j]!=-1)
                    cout<<i<<" "<<char(j)<<" "<<trans_DFA[i][j]<<endl;
            }
        }
    }
}
int main(){
    for(int i=0;i<200;i++){
        for(int j=0;j<200;j++){
           for(int k=0;k<100;k++){
               trans[i][j].node [k]='@';
           }
        }
    }
    NFA();
    showNFA();
    
    memset(trans_DFA,-1,sizeof(trans_DFA));
    memset(finalFlag,0,sizeof(finalFlag));
    child_method();
    cout<<"groupCount:           "<<groupCount<<endl;
    showGroup();
    cout<<"********************"<<endl;
    showDFAtrans();
}

猜你喜欢

转载自www.cnblogs.com/wtx2333/p/12527678.html