📄 cifafenxi.cpp
字号:
case 1303:
case 1307:
case 1308:
tempstr1=outputstack.top();
outputstack.pop();
tempstr2=outputstack.top();
outputstack.pop();
m_out<<"+"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
cout<<"\t\t\t\t\t"<<"+"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
outputstack.push(*(tempstring.end()-1));
tempstring.erase((tempstring.end()-1));
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.push(pair<char,string>('E',""));
status_stack.pop();
status_stack.pop();
status_stack.pop();
status_stack.push(gotofind(status_stack.top()*100+setchartoint('E')));
return 2;
case 1402:
case 1403:
case 1407:
case 1408:
tempstr1=outputstack.top();
outputstack.pop();
tempstr2=outputstack.top();
outputstack.pop();
m_out<<"-"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
cout<<"\t\t\t\t\t"<<"-"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
outputstack.push(*(tempstring.end()-1));
tempstring.erase((tempstring.end()-1));
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.push(pair<char,string>('E',""));
status_stack.pop();
status_stack.pop();
status_stack.pop();
status_stack.push(gotofind(status_stack.top()*100+setchartoint('E')));
return 2;
case 1502:
case 1503:
case 1504:
case 1505:
case 1507:
case 1508:
tempstr1=outputstack.top();
outputstack.pop();
tempstr2=outputstack.top();
outputstack.pop();
m_out<<"*"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
cout<<"\t\t\t\t\t"<<"*"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
outputstack.push(*(tempstring.end()-1));
tempstring.erase((tempstring.end()-1));
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.push(pair<char,string>('T',""));
status_stack.pop();
status_stack.pop();
status_stack.pop();
status_stack.push(gotofind(status_stack.top()*100+setchartoint('T')));
return 2;
case 1602:
case 1603:
case 1604:
case 1605:
case 1607:
case 1608:
tempstr1=outputstack.top();
outputstack.pop();
tempstr2=outputstack.top();
outputstack.pop();
m_out<<"/"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
cout<<"\t\t\t\t\t"<<"/"<<"\t"<<tempstr2<<"\t"<<tempstr1<<"\t"<<*(tempstring.end()-1)<<endl;
outputstack.push(*(tempstring.end()-1));
tempstring.erase((tempstring.end()-1));
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.push(pair<char,string>('T',""));
status_stack.pop();
status_stack.pop();
status_stack.pop();
status_stack.push(gotofind(status_stack.top()*100+setchartoint('T')));
return 2;
case 1702:
case 1703:
case 1704:
case 1705:
case 1707:
case 1708:
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.pop();
sysm_stack.push(pair<char,string>('F',""));
status_stack.pop();
status_stack.pop();
status_stack.pop();
status_stack.push(gotofind(status_stack.top()*100+setchartoint('F')));
return 2;
case 308:
tempstr1=outputstack.top();
outputstack.pop();
outputstack.pop();
tempstr2=outputstack.top();
outputstack.pop();
m_out<<"="<<"\t"<<tempstr1<<"\t"<<"\t"<<tempstr2<<endl;
cout<<"\t\t\t\t\t"<<"="<<"\t"<<tempstr1<<"\t"<<"\t"<<tempstr2<<endl;
return 0;
}
}
bool identify(list<pair<char,string> > listsource)
{
stack<int>status_stack;
stack<pair<char,string> >sysm_stack;
char ch[2];
int i,j,t,k,v;
ch[1]=0;
pair<char,string> tempstr;
sysm_stack.push(pair<char,string>(';',""));
stack<int> tempstatus_stack;
stack<pair<char,string> > tempsysm_stack;
stack<string> outputstack;
ofstream m_out;
m_out.open("4yuabshi.txt");
if(!m_out.is_open())
cout<<"can't create 4yuanshi.txt;\n";
vector<string> tempstring;
for(j = 90;j != 64; --j)
{
ch[0]=char(j);
tempstring.push_back(ch);
}
list<pair<char,string> >::iterator listiter;
for(listiter=listsource.begin();listiter!=listsource.end();++listiter)
{
cout<<"\t"<<listiter->first<<endl;
}
status_stack.push(0);
for(listiter=listsource.begin();;)
{
v=status_stack.size();
for(k=0;k<v;k++)
{
i=status_stack.top();
tempstatus_stack.push(i);
status_stack.pop();
}
for(k=0;k<v;k++)
{
i=tempstatus_stack.top();
cout<<left<<i;
status_stack.push(i);
tempstatus_stack.pop();
}
cout<<"\t\t";
v=sysm_stack.size();
for(k=0;k<v;k++)
{
tempstr=sysm_stack.top();
tempsysm_stack.push(tempstr);
sysm_stack.pop();
}
for(k=0;k<v;k++)
{
tempstr=tempsysm_stack.top();
cout<<left<<tempstr.first;
sysm_stack.push(tempstr);
tempsysm_stack.pop();
}
cout<<"\t\t";
i=status_stack.top();
list<pair<char,string> >::iterator listiter1;
cout<<right;
list<pair<char,string> > listsource1;
copy(listiter,listsource.end(),back_insert_iterator<list<pair<char,string> > >(listsource1));
for(listiter1=listsource1.begin();listiter1!=listsource1.end();++listiter1)
cout<<listiter1->first;
cout<<endl;
j=setchartoint(listiter->first);
if(j==-1)
return false;
if(actionAndgoto[i][j])
{
t=100*i+j;
pair<char,string> pp(listiter->first,listiter->second);
k=doforpush(status_stack,sysm_stack,outputstack,tempstring,t,&pp,m_out);
if(k==1)
{
++listiter;
continue;
}
else if(k==2)
continue;
else
return true;
}
else
return false;
}
}
// main function
void main()
{
cllist l1;
l1=(cllist) malloc(sizeof(cl));
bllist l2;
l2=(bllist) malloc(sizeof(bl));
clcreatlist(l1);
blcreatlist(l2);
FILE *in,*out,*table;
char str[MAX];
float sum,x=1;
char in_char;
int i=0,a,l;
if((in=fopen("infile.txt","r"))==NULL)
{
printf("can not open file\n");
exit(0);
}
if((out=fopen("outfile.txt","w"))==NULL)
{
printf("cannout open outfile\n");
exit(1);
}
if((table=fopen("table.txt","w"))==NULL)
{
printf("cannout open outfile\n");
exit(1);
}
in_char=fgetc(in);
while(!feof(in))
{
x=1;
while(in_char==' '||in_char==' ')
{
in_char=fgetc(in);
}
if(feof(in))
break;
else if((in_char>='a'&&in_char<='z')||(in_char>='A'&&in_char<='Z')||(in_char>='0'&&in_char<='9')||check1(in_char,&a)||check2(in_char,&a)||in_char=='\n'||in_char=='\r')
{
if(in_char>='0'&&in_char<='9')
{
sum=float(int(in_char)-48);
in_char=fgetc(in);
while(in_char>='0'&&in_char<='9')
{
sum*=10;
sum+=int(in_char)-48;
in_char=fgetc(in);
}
if(in_char!='.')
{
if(clfind(l1,sum,&a,&l))
fprintf(out,"%d,%d%s",l,a,"\n");
else
{
cllistinsert(l1,sum);
clfind(l1,sum,&a,&l);
fprintf(out,"%d,%d%s",l,a,"\n");
}
}
else
{
in_char=fgetc(in);
while(in_char>='0'&&in_char<='9')
{
x=x/10;
sum=sum+x*(int(in_char)-48);
in_char=fgetc(in);
}
if(clfind(l1,sum,&a,&l))
fprintf(out,"%d,%d%s",l,a,"\n");
else
{
cllistinsert(l1,sum);
clfind(l1,sum,&a,&l);
fprintf(out,"%d,%d%s",l,a,"\n");
}
}
}
else if((in_char>='a'&&in_char<='z')||(in_char>='A'&&in_char<='Z'))
{
i=0;
str[i++]=in_char;
in_char=fgetc(in);
while((in_char>='a'&&in_char<='z')||(in_char>='0'&&in_char<='9')||(in_char>='A'&&in_char<='Z')||in_char=='_')
{
str[i++]=in_char;
in_char=fgetc(in);
}
str[i++]='\0';
if(check3(str,&a))
fprintf(out,"%d,%d%s",guanbao[a].leibie,guanbao[a].add,"\n");
else if(blfind(l2,str,&a,&l))
fprintf(out,"%d,%d%s",l,a,"\n");
else
{
bllistinsert(l2,str,i);
blfind(l2,str,&a,&l);
fprintf(out,"%d,%d%s",l,a,"\n");
}
}
else if(check1(in_char,&a))
if(in_char=='/')
{
in_char=fgetc(in);
if(in_char=='/')
{
while(in_char!='\n')
in_char=fgetc(in);
in_char=fgetc(in);
}
else
fprintf(out,"%d,%d%s",wordyun[a].leibie,wordyun[a].add,"\n");
}
else
{
fprintf(out,"%d,%d%s",wordyun[a].leibie,wordyun[a].add,"\n");
in_char=fgetc(in);
}
else if(check2(in_char,&a))
{
fprintf(out,"%d,%d%s",wordjie[a].leibie,wordjie[a].add,"\n");
in_char=fgetc(in);
}
while(in_char=='\n'||in_char=='\r')
{
in_char=fgetc(in);
}
}
else
{
fprintf(out,"%s,%c%c%c%c","error",'"',in_char,'"','\n');
in_char=fgetc(in);
}
}
fprintf(table,"%d%s",1,".关键字\n");
for(i=0;i<32;i++)
fprintf(table,"%s%d,%s%s","(",guanbao[i].add,guanbao[i].zifu,")\n");
fprintf(table,"%c%d%s",'\n',2,".运算符\n");
for(i=0;i<20;i++)
fprintf(table,"%s%d,%c%s","(",wordyun[i].add,wordyun[i].suan,")\n");
fprintf(table,"%c%d%s",'\n',3,".界符\n");
for(i=0;i<7;i++)
fprintf(table,"%s%d,%c%s","(",wordjie[i].add,wordjie[i].jie,")\n");
fprintf(table,"%c%d%s",'\n',4,".常量\n");
cllist p;
p=l1->next;
while(p)
{
fprintf(table,"%s%d,%f%s","(",p->add,p->data,")\n");
p=p->next;
}
fprintf(table,"%c%d%s",'\n',5,".标识符\n");
bllist q;
q=l2->next;
while(q)
{
fprintf(table,"%s%d,%s%s","(",q->add,q->name,")\n");
q=q->next;
}
fclose(in);
fclose(out);
ifstream m_in;
m_in.open("outfile.txt");
if(!m_in.is_open())
cout<<"can't open outfile.txt;\n";
//cout<<m_in.rdbuf();
list<pair<char,string> > listsource;
string m_str,strstr;
while(getline(m_in,m_str))
{
int local=m_str.find(',');
strstr=xbfind((int)strtofloat1(m_str.substr(0,local)),(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1)),l1,l2,guanbao,wordyun,wordjie);
cout<<strstr;
switch((int)strtofloat1(m_str.substr(0,local)))
{
case 1:
break;
case 2:
listsource.push_back(pair<char,string>(wordyun[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].suan,strstr));
break;
case 3:
listsource.push_back(pair<char,string>(wordjie[(int)strtofloat1(m_str.substr(local+1,m_str.size()-local-1))].jie,strstr));
break;
case 4:
case 5:
listsource.push_back(pair<char,string>('i',strstr));
break;
}
}
cout<<endl;
//string strsource="i=i+i*(i-i/i);";
//cout<<strsource<<endl;
if(identify(listsource))
{
cout<<"success!"<<endl;
}
else
cout<<"error!"<<endl;
m_in.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -