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

📄 easycode.cpp

📁 一个不算完整的编译器实现
💻 CPP
字号:
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
using namespace std;
ofstream out1("system\\outFile.txt");
ofstream out2("system\\har_tree.txt");
int sum;
struct Dag
{
	string id;
	vector<string>ids;
	int son;
	Dag* lchild;
	Dag* rchild;
};

vector<Dag*> dag;

int node(string id)
{
	for(int i=(int)(dag.size()-1);i>=0;i--)
	{
		if(dag[i]->id==id)
					return i;
		for(int j=(int)dag[i]->ids.size()-1;j>=0;j--)
						if(dag[i]->ids[j]==id)	return i;
	}
	return -1;
}

void Out(ofstream& out,Dag* s)
{
	out<<"节点:"<<s->id<<endl<<"	附加符号:";
	for(int j=0;j<(int)s->ids.size();j++)
 			out<<" "<<s->ids[j];out<<endl;
	if(s->son==0)	return ;
	out<<"		有"<<s->son<<"个孩子: "; 
	out<<s->lchild->id<<" ";
	if(s->son==2)
				out<<s->rchild->id<<endl; 
	Out(out,s->lchild);
	if(s->son==2)
		Out(out,s->rchild);
	out<<endl;
}

void opN(string op,string y,string z,string x)
{
	Dag* nodey;
	Dag* n;
	int i=0;
	if(y=="-")
	{
		nodey=new Dag;
		nodey->son=0;
		nodey->id=y;
		dag.push_back(nodey);
	}
	else
	{
		if(node(y)<0)
		{
			nodey=new Dag;
			nodey->son=0;
			nodey->id=y;
			dag.push_back(nodey);
		}
		else	nodey=dag[node(y)];
	}
	if(op=="RETURN")
	{
		n=new Dag;
		n->id=op;
		n->ids.push_back("-");
		n->son=1;
		n->lchild=nodey;
		dag.push_back(n);
		return ;
	}
	if(z!="-")
	{
		Dag* nodez;
		if(node(z)<0)
		{
			nodez=new Dag;
			nodez->id=z;
			nodez->son=0;
			dag.push_back(nodez);
		}
		else	nodez=dag[node(z)];
		for(i=(int)dag.size()-1;i>=0;i--)
		{
			if(dag[i]->id==op&&dag[i]->son==2)
			{
				if(dag[i]->lchild==nodey&&dag[i]->rchild==nodez)
				{
					n=dag[i];break;
				}
			}
		}
		if(i==-1)
		{
			n=new Dag;
			n->son=2;
			n->id=op;
			n->lchild=nodey;
			n->rchild=nodez;
			dag.push_back(n);
		}
	}
	else{
			if(op!="=")
			{
				for(i=(int)dag.size()-1;i>=0;i--)
				{
					if(dag[i]->id==op&&dag[i]->son==1)
					{
						if(dag[i]->lchild==nodey)
						{
							n=dag[i];break;
						}
					}
				}
				if(i==-1)
				{
					n=new Dag;
					n->id=op;
					n->son=1;
					n->lchild=nodey;
					dag.push_back(n);
				}
			}
			else{
					n=nodey;
			}
	}
	for(i=(int)dag.size()-1;i>=0;i--)
	{
		int j=0;
		for(j=(int)dag[i]->ids.size()-1;j>=0;j--)
		{
			if(dag[i]->ids[j]==x)
			{
				dag[i]->ids.erase(dag[i]->ids.begin()+j);
														break;
			}
		}
	}
	n->ids.push_back(x);
}

void opV(vector<string> s)
{
	string x,y,z,op;
	int i=0;
	while(i<(int)s.size())
	{
		op=s[i];i++;
		y=s[i];i++;
		z=s[i];i++;
		x=s[i];i++;
		opN(op,y,z,x);
	}
	return ;
}

bool isNUM(string a)
{
 	 if(a[0]>='0'&&a[0]<='9')
	  						 return true;
	 if(a.length()>1&&a[0]=='-')			return true;
	 return false; 	 
}
bool isTemp(string a)
{
 	 if(a.length()<12)	return false;
	 string t="buctcs2005_";
	 for(int i=0;i<a.length(),i<11;i++)
	 		 if(a[i]!=t[i])		return false;
	 return true;
}
bool isCmp(string a)
{
	if(a=="=="||a=="<="||a==">="||a=="!="||a=="<"||a==">")
								return true;
	return false;	
}
string Cmp(string op,int a,int b)
{
	if(a<b)
	{
		if(op=="<"||op=="<=") return "true";
		return "false";	
	}
	if(a==b)
	{
		if(op=="=="||op=="<="||op==">=")	return "true";
		return "false";	
	}
	if(a>b)
	{
		if(op==">"||op==">=")	return "true";
		return "false";
	}
	return "false";
}
bool canOP(string& op,string b,string c)
{
   if(isCmp(op))
   {
		if(b==c)
		{
			if(op=="=="||op=="<="||op==">=")
								op="true";
			else	op="false";
			return true;
		}
   }
   if(isNUM(b)&&isNUM(c))
   {
       int bi=atoi(b.c_str());
       int ci=atoi(c.c_str());
       if(isCmp(op))
       {
			op=Cmp(op,bi,ci);
			return true;
	   }
	   int ai=0;
       if(op=="+")
       			  ai=bi+ci;
	   else if(op=="-")
	   				   ai=bi-ci;
	   else if(op=="/")
	   			ai=bi/ci;
	   else	if(op=="*")
	   				ai=bi*ci;
	   else return false;
	   char s[20];
	   sprintf(s,"%d",ai);
	   op=s;
       return true;	 
   }
   else if((b=="true"||b=="false")&&(c=="true"||c=="false"))
   {
   		if(op=="!=")
   		{
			if(b==c)	op="false";
			else		op="true";	
		}
		else if(op=="&&")
   		{
		 	if(b=="false"||c=="false")
			 				op="false";
			else		    op="true";		
        }
        else if(op=="||")
		{
			 if(b=="true"||c=="true")
			 						 op="true";
			 else	op="false";
        }
        else	return false;
        return true;
   } 
   return false;	 
}
void showTree()
{
	int t=(int)dag.size()-1;
	if(t<0)	return ;
	out2<<endl<<"		TREE	BEGIN	"<<endl;
	Out(out2,dag[t]);
	out2<<endl<<"		TREE	ENDS	"<<endl;
	for(int i=0;i<t+1;i++)
	{
	 	int l=(int)dag[i]->ids.size();
 		if(l==0)	continue;
		if(dag[i]->son==0)
		{
		 	 for(int j=0;j<l;j++)
			 {
			   	if(isTemp(dag[i]->ids[j]))	continue;
				else{
					 out1<<"=\t\t"<<dag[i]->id<<"\t\t-\t\t"<<dag[i]->ids[j]<<endl;
			    }	 
		     }	 
	    }
		else if(dag[i]->son==1)
		{
	        bool need=true;
			if(dag[i]->lchild->id=="true")
		 								  dag[i]->id="false";
		    else if(dag[i]->lchild->id=="false")
						                  dag[i]->id="true";
            else if(isNUM(dag[i]->lchild->id))
 	 		{
			   int num=atoi(dag[i]->id.c_str());
			   num=-num;
			   char s[20];
			   sprintf(s,"%d",num);
			   dag[i]->id=s;
		    }
		 	else
		 	{
				 int j=0;
				 for(j=0;j<l;j++)
	             {
				  	if(!isTemp(dag[i]->ids[j]))
					  						  break;	
			     }
				 if(j==l)
				 {
				  	  out1<<dag[i]->id<<"\t\t"<<dag[i]->lchild->id<<"\t\t-\t\t"<<dag[i]->ids[0]<<endl;	
			          dag[i]->id=dag[i]->ids[0];	 
		         }
				 else{
				 	   string op=dag[i]->id;
				 	   dag[i]->id=dag[i]->ids[j];
				 	   for(int k=j;k<l;k++)
				 	   {
					   		if(isTemp(dag[i]->ids[j]))
							   						  continue;
						    out1<<op<<"\t\t"<<dag[i]->lchild->id<<"\t\t-\t\t"<<dag[i]->ids[j]<<endl;   
			           }
		         }
				 need=false;						
	        }
	        if(need)
	        {
			 	 int j=0;
				 for(j=0;j<l;j++)
				 {
				       if(isTemp(dag[i]->ids[j]))
				    						   continue;
		               out1<<"=\t\t"<<dag[i]->id<<"\t\t-\t\t"<<dag[i]->ids[j]<<endl; 
				 }	
		    }
        } 
		else{
			  if(canOP(dag[i]->id,dag[i]->lchild->id,dag[i]->rchild->id))
			  {
			   		for(int j=0;j<l;j++)
					{
					 	if(isTemp(dag[i]->ids[j]))
						 						  continue;
						out1<<"=\t\t"<<dag[i]->id<<"\t\t-\t\t"<<dag[i]->ids[j]<<endl;	
				    }													 
		      }
		      else{
			  	     int j=0;
					 for(j=0;j<l;j++)
		             {
					  	if(!isTemp(dag[i]->ids[j]))
						  						  break;	
				     }
					 if(j==l)
					 {
					  	  out1<<dag[i]->id<<"\t\t"<<dag[i]->lchild->id<<"\t\t"<<dag[i]->rchild->id<<"\t\t"<<dag[i]->ids[0]<<endl;	
				          dag[i]->id=dag[i]->ids[0];	 
			         }
					 else{
					 	   string op=dag[i]->id;
					 	   dag[i]->id=dag[i]->ids[j];
					 	   for(int k=j;k<l;k++)
					 	   {
						   		if(isTemp(dag[i]->ids[k]))
								   						  continue;
							    out1<<op<<"\t\t"<<dag[i]->lchild->id<<"\t\t"<<dag[i]->rchild->id<<"\t\t"<<dag[i]->ids[k]<<endl;   
				           }
			         }
              }
	    }		
	}
    return ;
}

void Read()
{
	ifstream in("system\\middlecode.txt");
	vector<string> s;
	string num="",a="",b="",c="",d="";
	in>>num;
	while(in)
	{
		if(isNUM(num))
		{
			in>>a>>c>>b>>d;
			if(a=="IF_F"||a=="GOTO"||a=="CALL")
			{
				opV(s);
				showTree();
				s.clear();
				dag.clear();
				out1<<a<<"\t\t"<<c<<"\t\t"<<b<<"\t\t"<<d<<endl;
			}
			else
			{
				if(a=="RETURN"||a=="=")
				{
					string d=c;
					c=b;
					b=d;
				}
				s.push_back(a);
				s.push_back(b);
				s.push_back(c);
				s.push_back(d);
			}
		}
		else{
				cout<<num<<endl;
				opV(s);
				showTree();
				s.clear();
				dag.clear();
				out1<<num<<endl;
		}
		in>>num;
	}
	opV(s);
	showTree();
	in.close();
	return ;
}
int main()
{
	sum=0;
	Read();
	out1.close();
	return 1;
}

⌨️ 快捷键说明

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