📄 jun.cpp
字号:
#include <iostream>
using namespace std;
#include <vector>
inline bool __isdigital(char value)
{
return value<='9'&&value>='0';
}
inline bool __isalpha(char value)
{
return (value>='a'&&value<='z')||(value>='A'&&value<='Z');
}
struct oitem
{
char VN;
char value[30];
oitem(char lhs,char *rhs)
{
memset(value,0,30);
VN=lhs;
if(rhs)
strcpy(value,rhs);
}
};
bool __islegalopr(char opr)
{
char legal[]="<=>";
for(int i=0;i<strlen(legal);i++)
{
if(opr==legal[i])
return true;
}
return false;
}
int newlabel=100;
vector<oitem> midtable;
oitem *git,*assit;
void print_otable()
{
oitem *it=midtable.begin();
for(;it!=midtable.end();it++)
{
cout<<it->VN<<' '<<it->value;
}
}
char input[1024];
void bool_induce();
void do_induce();
void assign_induce();
void do_induce()
{
newlabel=100;
char label[10];
memset(label,0,3);
itoa(newlabel,label,10);
strcpy(midtable.begin()->value,label);
assign_induce();
bool_induce();
}
void assign_induce()
{
if(assit->VN!='i')
{
cout<<"assiging sentence error"<<endl;
int m;
cin>>m;
exit(0);
}
while(assit>midtable.begin()+2)
{
if((assit-1)->VN!='='&&(assit-2)->VN!='i')
{
cout<<"assiging sentence error"<<endl;
int m;
cin>>m;
exit(0);
}
assit-=2;
cout<<newlabel++<<':'<<'\t'<<'='<<'\t'<<(assit+2)->value<<'\t'<<'-'<<'\t'<<assit->value<<endl;
}
return;
}
void bool_induce()
{
int m;
if(git==midtable.end())
{
cout<<"lack condition sentences"<<endl;
cin>>m;
}
else if((git+1)->VN!='<'&&(git+1)->VN!='>')
{
cout<<"lack condition sentences"<<endl;
cin>>m;
}
if((git+2)->VN=='=')
cout<<newlabel++<<':'<<'\t'<<'j'<<(git+1)->VN<<'='<<'\t'<<git->value<<'\t'<<(git+3)->value<<'\t'<<midtable.begin()->value<<endl;
else
cout<<newlabel++<<':'<<'\t'<<'j'<<(git+1)->VN<<'\t'<<git->value<<'\t'<<(git+2)->value<<'\t'<<midtable.begin()->value<<endl;
cout<<newlabel++<<':'<<'\t';
cout<<'j'<<'\t'<<'-'<<'\t'<<'-'<<'\t'<<newlabel++;
}
int main()
{
memset(input,0,1024);
gets(input);
char temp;
int firstindex=0;
int nextindex=0;
char tmp[30];
for(;nextindex<strlen(input);nextindex++)
{
temp=input[nextindex];
if(__isdigital(temp)==false&&__isalpha(temp)==false)
{
if(firstindex==nextindex)
{
if(temp!=' '&&temp!='#')
{
if(__islegalopr(temp))
midtable.push_back(oitem(temp,""));
else
{
cout<<"error express"<<endl;
exit(0);
}
}
if(temp=='#')
{
break;
}
firstindex++;
continue;
}
memset(tmp,0,30);
memcpy(tmp,input+firstindex,nextindex-firstindex);
midtable.push_back(oitem('i',tmp));
if(temp=='#')
break;
else if(__islegalopr(temp))
midtable.push_back(oitem(temp,""));
else if(temp!=' ')
{
cout<<"error"<<endl;
exit(0);
}
firstindex=nextindex+1;
}
else if(__isalpha(temp))
{
if(firstindex!=nextindex&&!__isalpha(input[firstindex]))
{
cout<<"error express"<<endl;
return 1;
}
}
}
if(midtable.empty())
return 0;
if(strcmp(midtable[0].value,"do")!=0)
{
cout<<"express must start with do"<<endl;
cin>>temp;
exit(0);
}
midtable[0].VN='$';
oitem *it=midtable.begin();
for(;it!=midtable.end();it++)
{
if(strcmp(it->value,"while")==0)
{
git=it;
git++;
assit=it;
assit--;
it->VN='@';
break;
}
}
if(it==midtable.end())
{
cout<<"lack while subsentence"<<endl;
cin>>temp;
exit(0);
}
do_induce();
cin>>temp;
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -