📄 if-else.cpp
字号:
string jiegou=str;
while(typ!='='){typ=type(s,pos,str);}
string shu[10];string fuhao[10];fuhao[0]="}";
int n=0;int m=1;int jishu=1;
T[k]=" L1: ";
str="";
typ=type(s,pos,str);
while(typ!='e'||fuhao[0]!="")
{
if(str!="+" && str!="-" &&str!=")" && str!="(" &&str!="*" &&str!="/"&&str!="}")
{
shu[n]=shu[n]+str;
str="";typ=type(s,pos,str);
n++;
}
pre=precede(fuhao[m-1],str);
if(pre=='<')
{
fuhao[m]=str;m++;
str="";
typ=type(s,pos,str);
}
else if(pre=='=')
{
fuhao[m-1]="";m--;
str="";
typ=type(s,pos,str);
}
else if(pre=='>')
{
change(T[k],go_num);go_num++;
T[k]=T[k]+" T";
char c; c=jishu-0+'0';jishu++;
T[k]=T[k]+c+"="+shu[n-2]+fuhao[m-1]+shu[n-1];
k++;
fuhao[m-1]="";m--;
shu[n-1]="";
shu[n-2]="";
shu[n-2]="T";shu[n-2]+=c;
n--;
}
}
change(T[k],go_num);go_num++;
T[k]=T[k]+" "+jiegou+"="+shu[0];
k++;
typ=type(s,pos,str);
str="";
typ=type(s,pos,str);
string jiegou1=str;
while(typ!='='){typ=type(s,pos,str);}
string shu1[10];string fuhao1[10];fuhao1[0]="}";
int n1=0;int m1=1;
T[k]=" L2: ";
str="";
typ=type(s,pos,str);
while(typ!='#'||fuhao1[0]!="")
{
if(str!="+" && str!="-" &&str!=")" && str!="(" &&str!="*" &&str!="/"&&str!="}")
{
shu1[n1]=shu1[n1]+str;
str="";typ=type(s,pos,str);
n1++;
}
pre=precede(fuhao1[m1-1],str);
if(pre=='<')
{
fuhao1[m1]=str;m1++;
str="";
typ=type(s,pos,str);
}
else if(pre=='=')
{
fuhao1[m1-1]="";m1--;
str="";
typ=type(s,pos,str);
}
else if(pre=='>')
{
change(T[k],go_num);go_num++;
T[k]=T[k]+" T";
char c; c=jishu-0+'0';jishu++;
T[k]=T[k]+c+"="+shu1[n1-2]+fuhao1[m1-1]+shu1[n1-1];
k++;
fuhao1[m1-1]="";m1--;
shu1[n1-1]="";
shu1[n1-2]="";
shu1[n1-2]="T";shu1[n1-2]+=c;
n1--;
}
}
change(T[k],go_num);go_num++;
T[k]=T[k]+" "+jiegou1+"="+shu1[0];
k++;
for(int z=0;z<k;z++)
{
cout<<T[z]<<endl;
}
cout<<100+k<<" end"<<endl;
}
//----------------------------------------------------------------------------------
//相关函数
void express(char * &express)
{
express=new char[52];
ifstream fin("ifelse.txt");
fin.getline(express, 51);
fin.close();
cout<<"输入的if-else语句:"<<endl;
cout<<express<<endl;
// cout<<"请输入表达式(限50个字符以内)"<<endl;
// cout<<"当输入#时为结束"<<endl;
// cin>>express;
}
char get_char(char *e,int &p)
{
char a=e[p];
p++;
return a;
}
char precede(string a,string b) //操作符优先级的判断
{
if(a=="+")
{
if(b=="*"||b=="/"|| b=="(")return '<';
else return '>';
}
if(a=="-")
{
if(b=="*"||b=="/"||b=="(")return '<';
else return '>';
}
if(a=="*")
{
if(b=="(")return '<';
else return '>';
}
if(a=="/")
{
if(b=="(")return '<';
else return '>';
}
if(a=="(")
{
if(b==")")return '=';
else if(b=="}"||b=="then")return '0';
else return '<';
}
if(a==")")
{
if(b=="(")return '0';
else return '>';
}
if(a=="}")
{
if(b==")"||b=="then")return '0';
else if(b=="}")return '=';
else return '<';
}
if(a=="&&")
{
if(b==")"||b=="}"|| b=="&&" ||b=="||" ||b=="then")return '>';
else return '<';
}
if(a=="||")
{
if(b==")"|| b=="}" ||b=="||"||b=="then")return '>';
else return '<';
}
if(a=="then")
{
if(b==")"||b=="}")return '0';
else if(b=="then")return '=';
else return '<';
}
return '0';
}
int lie(char c) //分析表的列
{
switch(c)
{
case 'i':return 0;
case 't':return 1;
case 'e':return 2;
case 'f':return 3;
case '=':return 4;
case '+':return 5;
case '*':return 6;
case '&':return 7;
case 'n':return 8;
case '(':return 9;
case ')':return 10;
case '{':return 11;
case '}':return 12;
case '#':return 13;
case 'F':return 14;
case 'E':return 15;
case 'K':return 16;
case 'T':return 17;
case 'S':return 18;
}
}
//-------------词法分析阶段------------------------
char divid(char * s,char ch) //界符的判断
{
char div[18]={'{','}','[',']','(',')',';','>','<','=','|','+','*','-','/','!','&','#'};
int i;
for(i=0;i<18;i++)
{
if(ch==div[i])return 'd';
}
return 'z';
}
char type (char * s,int &pos,string & str) //将输入的字符串转换成为相应的字符
{
char ch=get_char(s,pos);
string keyword[10]={"int","char","if","then","else","bool","while","do","true","false"};
if(ch=='('){str+='('; return '(';}
if(ch==')'){str+=')'; return ')';}
if(ch=='#'){str+='#'; return '#';}
if(ch=='{'){str+='{'; return '{';}
if(ch=='}'){str+='}'; return '}';}
if(ch=='+'){str+='+'; return '+';}
if(ch=='-'){str+='-'; return '+';}
if(ch=='*'){str+='*'; return '*';}
if(ch=='/'){str+='/'; return '*';}
if(ch=='<')
{
if(get_char(s,pos)=='='){str=str+'<'; str=str+'='; return '&';}
else{pos--;str+='<'; return '&';}
}
if(ch=='>')
{
if(get_char(s,pos)=='='){str=str+'>';str=str+'='; return '&';}
else{pos--;str+='>';return '&';}
}
if(ch=='|')
{
if(get_char(s,pos)=='|'){str=str+'|';str=str+'|'; return '&';}
else{pos--;str+='|';return '&';}
}
if(ch=='&')
{
if(get_char(s,pos)=='&'){str=str+'&';str=str+'&'; return '&';}
else{pos--;str+='&';return '&';}
}
if(ch=='=')
{
if(get_char(s,pos)=='='){str=str+'=';str=str+'='; return '&';}
else{pos--;str+='=';return '=';}
}
char c=divid(s,ch);
int i;
if((ch>='a'&& ch<='z')||(ch>='A'&&ch<='Z'))
{ c=divid(s,ch);
while(ch!='\0'&& c=='z') //如果不是空字符
{
str=str+ch;
ch=get_char(s,pos);c=divid(s,ch);
}
pos--;
if(str=="if")return 'i';
else if(str=="then")return 't';
else if(str=="else")return 'e';
for(i=0;i<10;i++)
{
if(str.compare(keyword[i])==0)return 'k'; //和关键字进行比较
}
return 'f';
}
if(ch>='0'&&ch<='9') //对数字进行组合
{
while(ch>='0' && ch<='9')
{ str=str+ch;
ch=get_char(s,pos);
}
if(ch=='.') //浮点数的操作
{ str=str+ch;
ch=get_char(s,i);
while(ch>='0' && ch<='9')
{
str=str+ch;
ch=get_char(s,pos);
}
}
pos--;
return 'n';
}
}
double convert(double s)
{
char c,t;
c=(char)s;
t='0';
return c-t;
}
char convert2(int s)
{
char t;
t=s-0+'0';
return t;
}
void change(string &t,int n) //生成操作下标
{int k=10;int d;
while(n!=0)
{
d=n%k;
t=convert2(d)+t;
n=n/10;
}
}
//---------------栈的相关操作------------------------
bool initstack_char(stack_char &s) //初始化栈
{
s.base =(char *)malloc(stack_init_size * sizeof(char));
if(!s.base )return false;
s.top =s.base ;
s.stacksize =stack_init_size;
return true;
}
bool initstack_double(stack_double &s)
{
s.base =(double *)malloc(stack_init_size * sizeof(double));
if(!s.base )return false;
s.top =s.base ;
s.stacksize =stack_init_size;
return true;
}
char gettop_char(stack_char &s) //获得栈顶元素
{
char e;
if(s.top ==s.base )return 0;
e=*(s.top -1);
return e;
}
int gettop_double(stack_double &s)
{
int e;
if(s.top ==s.base )return 0;
e=int(*(s.top -1));
return e;
}
bool push_char(stack_char &s,char e) //元素进栈
{
if(s.top -s.base >=s.stacksize )
{
s.base =(char *)realloc (s.base ,(s.stacksize + stackincrement) * sizeof(char));
if(!s.base )return false;
s.top =s.base +s.stacksize ;
s.stacksize =s.stacksize +stackincrement;
}
*( s.top )++=e;
return false;
}
bool push_double(stack_double &s,double e)
{
if(s.top -s.base >=s.stacksize )
{
s.base =(double *)realloc (s.base ,(s.stacksize + stackincrement) * sizeof(double));
if(!s.base )return false;
s.top =s.base +s.stacksize ;
s.stacksize =s.stacksize +stackincrement;
}
*( s.top )++=e;
return false;
}
bool pop_char(stack_char &s,char &e)//通过判断栈顶和栈底元素来进行出栈操作,出栈后用e返回指向栈顶的指针
{
if(s.top ==s.base )return false;
e= * --s.top ;
return true;
}
bool pop_double(stack_double &s,double &e)
{
if(s.top ==s.base )return false;
e= * --s.top ;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -