⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylex.cpp

📁 一个不算完整的编译器实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}
void toMinDFA()
{
     vector< vector<int> >AP;
     vector< vector<int> >nAP;
	 vector<string>ac;
     vector<int>v1;
     int ls=(int)DFAVector.size();
     for(int i=0;i<ls;i++)
     {
          if(!DFAVector[i]->accept)
          {
               DFAVector[i]->at=0;
               v1.push_back(i);
          }
          else
          {
              int j=0,l=(int)ac.size(),l1=(int)nAP.size();
			  for(j=0;j<l;j++)
				  if(ac[j]==DFAVector[i]->ID)  break;
			  if(j==l)
			  {
					ac.push_back(DFAVector[i]->ID);
					DFAVector[i]->at=l1+1;
					vector<int>v2;
					v2.push_back(i);
					nAP.push_back(v2);
			  }
			  else
			  {
				   DFAVector[i]->at=j+1;
				   nAP[j].push_back(i);
			  }
          }        
     }
	 ls=(int)nAP.size();
     AP.push_back(v1);
     for(int i=0;i<ls;i++)
	 {
		vector<int> v2=nAP[i];
		AP.push_back(v2);
	 }
	 nAP.clear();
     int lss=(int)AP.size();
     bool getNew=true;
     while(getNew)
     {
         getNew=false;
         nAP.clear();
         int l=(int)AP.size();
         vector<int>newv;
         for(int i=0;i<l;i++)
         {
             vector<int>v=AP[i];
             int li=(int)v.size();
             if(li==1||getNew)       
             {
                 nAP.push_back(v);
                 continue;
             }
             int lj=(int)dataVector.size(),j=0;
             for(j=0;j<lj;j++)
             {
                 int k=0,q=move(DFAVector[v[0]],dataVector[j]);
                 for(k=1;k<li;k++)
                 {
                      int p=move(DFAVector[v[k]],dataVector[j]);
                      if(p!=q)
                      {
                           DFAVector[v[k]]->at=l;
                           newv.push_back(v[k]);
                           v.erase(v.begin()+k);
                           k--;
                           li--;
                           getNew=true;
                      }
                      if(li==1)  break;
                 }
                 if(li==1)       break;    
             }
             nAP.push_back(v);              
         }
         if(!newv.empty())  nAP.push_back(newv);
         AP=nAP;
         lss=(int)AP.size();                   
     }
     lss=(int)AP.size();
	 int enter=0;
     for(int i=0;i<lss;i++)
     {
         Node* node=new Node;
         node->id='A'+i;
         node->accept=false;
         int ls=(int)AP[i].size();
         for(int j=0;j<ls;j++)
         {
             DFANode* q=DFAVector[AP[i][j]];
             if(q->id=='A')
             {
                  enter = i;              
             }
             if(q->accept)
             {
				  node->accept=true;
                  node->ID=q->ID;
             }
             int sls =(int) q->next.size();
             for(int k=0;k<sls;k++)
             {
                 int p=move(q,q->toNext[k]);
				 if(!include(node->toNext,q->toNext[k]))
				 {
					 node->next.push_back(p);
					 node->toNext.push_back(q->toNext[k]);
				 }
             }       
        }
         MDFA.push_back(node);
     }
     cou<<" minDFA:"<<endl;
     for(int i=0;i<lss;i++)
     {
         int ssls=(int)MDFA[i]->toNext.size();
         for(int j=0;j<ssls;j++)
         {
             int p=MDFA[i]->next[j];
             cou<<"    ";
             if(i==enter)  cou<<"入口";
			 else		   cou<<"    ";
			 cou<<MDFA[i]->id<<"-"<<MDFA[i]->toNext[j]<<"->"<<MDFA[p]->id;
			 if(MDFA[p]->accept)
			 {
				 cou<<" -> 可被接受为 "<<MDFA[p]->ID;
			 }
			 cou<<endl;        
         }       
     }
     cou<<endl<<" - - - - - - - - - - minDFA - END - - - - - - - - - "<<endl<<endl;
     
	 Begin = MDFA[enter];
     return ;
}
void toDFA()
{
     char sign='A';
     Dbegin = new DFANode;
     DFAVector.push_back(Dbegin);
     Dbegin->states = E_closure(0);
     getAccept(Dbegin);
     Dbegin->id=sign;sign++;
     int l=(int)dataVector.size();
     stack<DFANode*>s;
     s.push(Dbegin);
     while(!s.empty())
     {
          DFANode* top=s.top();s.pop();
          for(int i=0;i<l;i++)
          {
                vector<int> temp=move(top->states,dataVector[i]);
                if(temp.empty())    continue;
                int ls=(int)DFAVector.size(),k=0;
                for(int j=0;j<ls;j++)
                {
                     if(equal(temp,DFAVector[j]->states))
                     {
                         top->next.push_back(DFAVector[j]);
                         top->toNext.push_back(dataVector[i]);
                         k++; 
                         break;                              
                     }
                }
                if(k==0)
                {
                    DFANode* newNode = new DFANode;
                    newNode->states=temp;
                    newNode->id=sign;sign++;
                    getAccept(newNode);
                    DFAVector.push_back(newNode);
                    s.push(newNode);
                    top->next.push_back(newNode);
                    top->toNext.push_back(dataVector[i]);     
                }  
          }
     }
     showDFA();
     toMinDFA();
	 return ;
}
string getString(char s)
{
	if(isDigit(s))	return "digit";
	if(isLetter(s))	return "letter";
	string ss="";
	ss+=s;
	return ss;
}
int Move(Node* q,char ss)
{
	string s=getString(ss);
	int l=(int)q->next.size();
	for(int i=0;i<l;i++)
	{
		if(q->toNext[i]==s)
		{
			Node* p = MDFA[q->next[i]];
			return q->next[i];;
		}
	}
	return -1;
}
string opWord(string s)
{
     if(include(keyWord,s))
                           return s;
     int l=s.length(),i=0;
     Node* here=Begin;
     for(i=0;i<l;i++)
     {
         int p=Move(here,s[i]);
         if(p<0)
         {
             return "ERROR";
         }
         here=MDFA[p];
     }
     if(i==l)
     {
         if(here->accept)
                         return here->ID;
         else	         return "ERROR";
     }    
}
void opFile()
{
	ifstream in("system\\inFile.txt");
    ofstream out("system\\tokens.txt");
	char s[1000];
    int sum=0;
	while(in)
	{
        int l=0;
        in.getline(s,1000);
 		l=(int)strlen(s);
        if(l==0)   continue;
        string ss="";
		for(int i=0;i<l;i++)
		{
             if(isLetter(s[i])||isDigit(s[i])||s[i]=='.')
                                              ss+=s[i];
             else
             {
                 if(ss!="")  
				 {
						out<<" "<<opWord(ss)<<" "<<ss;
						if(opWord(ss)=="ERROR")
						{
							errors.push_back(ss);
							errorline.push_back(sum);
						}
				}
                 ss="";
                 if(s[i]==' '||s[i]=='	') continue;
                 ss+=s[i];
                 if(i<l-1)
                 {
                     ss+=s[i+1];
                     if(opWord(ss)!="ERROR")
                     {
                         string last=ss;
                         while(opWord(ss)!="ERROR")
                         {i++;last=ss;ss+=s[i+1];}
                         ss=last;
                    	 {
							 out<<" "<<opWord(ss)<<" "<<ss;
						 	 if(opWord(ss)=="ERROR")
							 {
								errors.push_back(ss);
								errorline.push_back(sum);
							 }
						 }
                     }
                     else
                     {
                         ss="";ss+=s[i];
                         out<<" "<<opWord(ss)<<" "<<ss;
						 if(opWord(ss)=="ERROR")
						 {
							errors.push_back(ss);
							errorline.push_back(sum);
						 }    
                     }
                 }
                 else{
						out<<" "<<opWord(ss)<<" "<<ss;
						if(opWord(ss)=="ERROR")
						{
							errors.push_back(ss);
							errorline.push_back(sum);
						}
				}
                 ss="";    
             }
        }
	}
	in.close();
	out<<" ";
	out.close();
}
void readKeyWord()
{
     ifstream in("system\\keyWord.txt");
     string word="";
     while(in>>word)
     {
          if(word=="ENDed")
                       			break;
          if(!include(keyWord,word))
                                keyWord.push_back(word);
     }
     in.close();
     return ;     
}
int main()
{
	dataStack.push(0);
    string s1="",s2="";
    begin = new Node;
    begin->accept=false;
    nodeVector.push_back(begin);
    end = new Node;
    end->accept=true;
    nodeVector.push_back(end);
	ifstream in("system\\ZhengFile.txt");
	while(in>>s1)
	{
           if(s1=="END")     break;
           in>>s2; 
           opStack.push('#');
           toNFA(s2); 
           int y=dataStack.top();dataStack.pop();
           int x=dataStack.top();dataStack.pop();
           nodeVector[y]->accept=true;
           nodeVector[y]->ID=s1;
           nodeVector[y]->next.push_back(1);
           nodeVector[y]->toNext.push_back("");
           begin->next.push_back(x);
           begin->toNext.push_back("");           
    }
	in.close();
    showNFA();
	toDFA();
	readKeyWord();
	opFile();
	ofstream err("system\\error.txt");
	if(!errorline.size()==0)
	{
		err<<"共有"<<errorline.size()<<"处词法错误"<<endl;
		for(int i=0;i<errorline.size();i++)
			err<<"	第"<<errorline[i]<<"行: "<<errors[i]<<endl;
		err.close();
	}
	else{
			err<<"分析成功";
			err.close();
			system("system\\compile3.exe");
	}
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -