📄 easycode.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 + -