📄 if-else.cpp
字号:
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define stack_init_size 100
#define stackincrement 10
struct stack_char
{
char * base;
char *top;
int stacksize;
};
struct stack_double
{
double * base;
double *top;
int stacksize;
};
bool initstack_char(stack_char &s);
bool initstack_double(stack_double &s);
char gettop_char(stack_char &s);
int gettop_double(stack_double &s);
bool push_char(stack_char &s,char e);
bool push_double(stack_double &s,double e);
bool pop_char(stack_char &s,char &e);
bool pop_double(stack_double &s,double &e);
void express(char * &express);
char get_char(char *e,int &p);
bool fx(char * s);
void siyuanshi(char * s);
char precede(string a,string b);
int lie(char c);
char divid(char * s,char ch) ;
char type (char * s,int &pos,string & str);
double convert(double s);
char convert2(int s);
void change(string &t,int n);
//----------------------------------------------------------------------------
int main ()
{
char *s;bool b;
express(s);
b=fx(s);
if(b==true)
{
siyuanshi(s);
}
return 1;
}
//----------------------------------------------------------------------------
bool fx(char * s) //语法分析SLR(1)
{
int i,j;
string fenxi[31][19];
fenxi[0][0]="s2";fenxi[0][18]="1";
fenxi[1][13]="acc";
fenxi[2][3]="s5";fenxi[2][8]="s6";fenxi[2][9]="s7";fenxi[2][14]="4";fenxi[2][15]="3";
fenxi[3][1]="s20";
fenxi[4][1]="r7";fenxi[4][5]="s11";fenxi[4][6]="s12";fenxi[4][7]="s13";fenxi[4][10]="r7";fenxi[4][12]="r7";
fenxi[4][16]="10";
fenxi[5][0]="r8";fenxi[5][1]="r8";fenxi[5][2]="r8";fenxi[5][3]="r8";fenxi[5][4]="r8";fenxi[5][5]="r8";fenxi[5][6]="r8";fenxi[5][7]="r8";fenxi[5][8]="r8";fenxi[5][9]="r8";fenxi[5][10]="r8";fenxi[5][11]="r8";fenxi[5][12]="r8";fenxi[5][13]="r8";
fenxi[6][0]="r9";fenxi[6][1]="r9";fenxi[6][2]="r9";fenxi[6][3]="r9";fenxi[6][4]="r9";fenxi[6][5]="r9";fenxi[6][6]="r9";fenxi[6][7]="r9";fenxi[6][8]="r9";fenxi[6][9]="r9";fenxi[6][10]="r9";fenxi[6][11]="r9";fenxi[6][12]="r9";fenxi[6][13]="r9";
fenxi[7][3]="s5";fenxi[7][8]="s6";fenxi[7][9]="s7";fenxi[7][14]="4";fenxi[7][15]="8";
fenxi[8][10]="s9";
fenxi[9][0]="r10";fenxi[9][1]="r10";fenxi[9][2]="r10";fenxi[9][3]="r10";fenxi[9][4]="r10";fenxi[9][5]="r10";fenxi[9][6]="r10";fenxi[9][7]="r10";fenxi[9][8]="r10";fenxi[9][9]="r10";fenxi[9][10]="r10";fenxi[9][11]="r10";fenxi[9][12]="r10";fenxi[9][13]="r10";
fenxi[10][0]="r3";fenxi[10][1]="r3";fenxi[10][2]="r3";fenxi[10][3]="r3";fenxi[10][4]="r3";fenxi[10][5]="r3";fenxi[10][6]="r3";fenxi[10][7]="r3";fenxi[10][8]="r3";fenxi[10][9]="r3";fenxi[10][10]="r3";fenxi[10][11]="r3";fenxi[10][12]="r3";fenxi[10][13]="r3";
fenxi[11][3]="s5";fenxi[11][8]="s6";fenxi[11][9]="s7";fenxi[11][14]="14";
fenxi[12][3]="s5";fenxi[12][8]="s6";fenxi[12][9]="s7";fenxi[12][14]="15";
fenxi[13][3]="s5";fenxi[13][8]="s6";fenxi[13][9]="s7";fenxi[13][14]="16";
fenxi[14][1]="r7";fenxi[14][5]="s11";fenxi[14][6]="s12";fenxi[14][7]="s13";fenxi[14][10]="r7";fenxi[14][12]="r7";fenxi[14][16]="17";
fenxi[15][1]="r7";fenxi[15][5]="s11";fenxi[15][6]="s12";fenxi[15][7]="s13";fenxi[15][10]="r7";fenxi[15][12]="r7";fenxi[15][16]="18";
fenxi[16][1]="r7";fenxi[16][5]="s11";fenxi[16][6]="s12";fenxi[16][7]="s13";fenxi[16][10]="r7";fenxi[16][12]="r7";fenxi[16][16]="19";
fenxi[17][0]="r4";fenxi[17][1]="r4";fenxi[17][2]="r4";fenxi[17][3]="r4";fenxi[17][4]="r4";fenxi[17][5]="r4";fenxi[17][6]="r4";fenxi[17][7]="r4";fenxi[17][8]="r4";fenxi[17][9]="r4";fenxi[17][10]="r4";fenxi[17][11]="r4";fenxi[17][12]="r4";fenxi[17][13]="r4";
fenxi[18][0]="r5";fenxi[18][1]="r5";fenxi[18][2]="r5";fenxi[18][3]="r5";fenxi[18][4]="r5";fenxi[18][5]="r5";fenxi[18][6]="r5";fenxi[18][7]="r5";fenxi[18][8]="r5";fenxi[18][9]="r5";fenxi[18][10]="r5";fenxi[18][11]="r5";fenxi[18][12]="r5";fenxi[18][13]="r5";
fenxi[19][0]="r6";fenxi[19][1]="r6";fenxi[19][2]="r6";fenxi[19][3]="r6";fenxi[19][4]="r6";fenxi[19][5]="r6";fenxi[19][6]="r6";fenxi[19][7]="r6";fenxi[19][8]="r6";fenxi[19][9]="r6";fenxi[19][10]="r6";fenxi[19][11]="r6";fenxi[19][12]="r6";fenxi[19][13]="r6";
fenxi[20][11]="s21";
fenxi[21][3]="s23";fenxi[21][17]="22";
fenxi[22][12]="s25";
fenxi[23][4]="s24";
fenxi[24][3]="s5";fenxi[24][8]="s6";fenxi[24][9]="s7";fenxi[24][14]="4";fenxi[24][15]="27";
fenxi[25][2]="s26";fenxi[26][11]="s28";
fenxi[27][0]="r2";fenxi[27][1]="r2";fenxi[27][2]="r2";fenxi[27][3]="r2";fenxi[27][4]="r2";fenxi[27][5]="r2";fenxi[27][6]="r2";fenxi[27][7]="r2";fenxi[27][8]="r2";fenxi[27][9]="r2";fenxi[27][10]="r2";fenxi[27][11]="r2";fenxi[27][12]="r2";fenxi[27][13]="r2";
fenxi[28][3]="s23";fenxi[28][17]="29";fenxi[29][12]="s30";
fenxi[30][0]="r1";fenxi[30][1]="r1";fenxi[30][2]="r1";fenxi[30][3]="r1";fenxi[30][4]="r1";fenxi[30][5]="r1";fenxi[30][6]="r1";fenxi[30][7]="r1";fenxi[30][8]="r1";fenxi[30][9]="r1";fenxi[30][10]="r1";fenxi[30][11]="r1";fenxi[30][12]="r1";fenxi[30][13]="r1";
char ch,typ; int pos=0;
int size;
string st;
//符号栈和状态栈的定义和初始化
stack_char symbol; initstack_char(symbol);
stack_double state; initstack_double(state);
push_double(state,0); push_char(symbol,'#');
ch=get_char(s,pos);
while(ch=='\0')
{ch=get_char(s,pos);}
pos--;
while(ch!='#'||gettop_char(symbol)!='#')
{
string str;
while(ch=='\0'){ch=get_char(s,pos);}
typ=type(s,pos,str);
i=gettop_double(state);
j=lie(typ);
st=fenxi[i][j];
if(st=="acc"){cout<<"语法分析成功!"<<endl;return true;}
if(st=="") {cout<<"语法出现错误!"<<endl;return false;}
size=st.size();
if(st[0]=='s')
{
double change=0;int k;
for(k=1;k<size;k++)
{
change=change*10+convert(st[k]);
}
push_double(state,change);
push_char(symbol,typ);
ch=get_char(s,pos);
pos--;
}
else if(st[0]=='r')
{
double change=0;int k;double e;char z;
for(k=1;k<size;k++)
{
change=change*10+convert(st[k]);
}
switch(int(change))
{
case 1:
for(k=0;k<10;k++)
{
pop_char(symbol,z);//如果是r1,则将符号栈和状态栈的栈顶元素出栈
pop_double(state,e);
}
push_char(symbol,'S');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 2:
for(k=0;k<3;k++)
{
pop_char(symbol,z);
pop_double(state,e);
}
push_char(symbol,'T');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 3:
for(k=0;k<2;k++)
{
pop_char(symbol,z);
pop_double(state,e);
}
push_char(symbol,'E');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 4:
case 5:
case 6:
for(k=0;k<3;k++)
{
pop_char(symbol,z);
pop_double(state,e);
}
push_char(symbol,'K');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 7:
push_char(symbol,'K');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 8:
case 9:
pop_char(symbol,z);
pop_double(state,e);
push_char(symbol,'F');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
case 10:
for(k=0;k<3;k++)
{
pop_char(symbol,z);
pop_double(state,e);
}
push_char(symbol,'F');
if(str=="then"||str=="else"){
pos=pos-4;
ch=get_char(s,pos);
}
else
{
if(str==">="||str=="<="||str=="=="||str=="&&")
{
pos=pos-2;
ch=get_char(s,pos);
}
}
break;
}
i=gettop_double(state);
j=lie(gettop_char(symbol));
string t;
t=fenxi[i][j];
if(t==""){cout<<"语法错误!"<<endl;return false;}
else
{ double go=0;int siz;siz=t.size();
for(k=0;k<siz;k++)
{
go=go*10+convert(t[k]);
}
push_double(state,go);
}
pos--;
}
}
}
//-------------------------语义分析阶段---------------------------------------
void siyuanshi(char * s)//语义分析
{
int pos=0;
char typ;
string str;
typ=type(s,pos,str);
while(typ!='('){typ=type(s,pos,str);}
char pre;
string t[20]; string biaozhi[20];string T[30];
biaozhi[0]="(";int i=0;int j=1;int k=0;int go_num=100;
str="";
typ=type(s,pos,str);
while(typ!='t')
{
if(str!="&&" && str!="||" &&str!=")" && str!="(")
{
while(str!="&&" && str!="||" &&str!=")" && str!="(")
{
t[i]=t[i]+str;
str="";
typ=type(s,pos,str);
}
i++;
}
pre=precede(biaozhi[j-1],str);
if(pre=='<')
{
biaozhi[j]=str;j++;
str="";
typ=type(s,pos,str);
}
else if(pre=='=')
{
biaozhi[j-1]="";j--;
str="";
typ=type(s,pos,str);
}
else if(pre=='>')
{
if(t[0]!="")
{
if(biaozhi[j-1]=="||")
{
if(t[i-2]!="T")
{ string temp;
change(temp,go_num+3);
change(T[k],go_num);go_num++;
T[k]=T[k]+" if "+t[i-2]+" goto "+temp;
k++;
}
if(t[i-1]!="T")
{
string temp;
change(temp,go_num+2);
change(T[k],go_num);go_num++;
T[k]=T[k]+" if "+t[i-1]+" goto "+temp;
k++;
}
change(T[k],go_num);go_num++;
T[k]=T[k]+" goto ";
k++;
}
else if(biaozhi[j-1]=="&&")
{
if(t[i-2]!="T")
{
string temp;
change(temp,go_num+2);
change(T[k],go_num);go_num++;
T[k]=T[k]+" if "+t[i-2]+" goto "+temp;
k++;
string temp1;
change(temp1,go_num+3);
change(T[k],go_num);go_num++;
T[k]=T[k]+" goto "+temp1;
k++;
}
if(t[i-1]!="T")
{
change(T[k],go_num);go_num++;
T[k]=T[k]+" if "+t[i-1]+" goto ";
k++;
change(T[k],go_num);go_num++;
T[k]=T[k]+" goto ";
k++;
}
}
t[i-1]="";t[i-2]="T";i=i-1;
biaozhi[j-1]="";j--;
}
else
{
biaozhi[j-1]="";j--;
}
}
}
if(t[0]!=""&&t[0]!="T")
{
change(T[k],go_num);go_num++;
T[k]=T[k]+" if "+t[0]+" goto L1";
k++;
change(T[k],go_num);go_num++;
T[k]=T[k]+" goto L2";
k++;
}
typ=type(s,pos,str);
str="";
typ=type(s,pos,str);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -