📄 parse.cpp
字号:
#include"parse.h"
#include"global.h"
#include<fstream.h>
#include<iostream.h>
#define M 256/*输入字符串最大长度*/
/*0为字符串结束符*/
int action[17][9]={{0,0}};
int Goto[17][2]={{0,0}};
int state[M];
int Anum=-1;
int Enum=-1;
int Inum=0;
int Readhead=0;
struct symbol{
int ID;
int num;
};
int derive[8][2];
int pstate=0;
int psymbol=0;
symbol symbols[M];
ofstream fout2("output1.txt");
void addstate(int x)
{
state[pstate++]=x;
}
void addsymbol(symbol x)
{
symbols[psymbol++]=x;
}
void initTable()
{
action[0][0]=2;
action[1][8]=0;//acc
action[2][5]=3;
action[3][6]=6;
action[3][0]=5;
action[4][5]=-1;
action[4][1]=9;
action[4][2]=10;
action[4][3]=11;
action[4][4]=12;
action[4][7]=-1;
action[4][8]=-1;
action[5][1]=-7;
action[5][2]=-7;
action[5][3]=-7;
action[5][4]=-7;
action[5][7]=-7;
action[5][8]=-7;
action[6][6]=6;
action[6][0]=5;
action[6][8]=-7;
action[7][1]=9;
action[7][2]=10;
action[7][3]=11;
action[7][4]=12;
action[7][7]=8;
action[8][1]=-6;
action[8][2]=-6;
action[8][3]=-6;
action[8][4]=-6;
action[8][7]=-6;
action[8][8]=-6;
action[9][6]=6;
action[9][0]=5;
action[10][6]=6;
action[10][0]=5;
action[11][6]=6;
action[11][0]=5;
action[12][6]=6;
action[13][1]=-2;
action[13][2]=-2;
action[13][3]=11;
action[13][4]=12;
action[13][7]=-2;
action[13][8]=-2;
action[14][1]=-3;
action[14][2]=-3;
action[14][3]=11;
action[14][4]=12;
action[14][7]=-3;
action[14][8]=-3;
action[15][1]=-4;
action[15][2]=-4;
action[15][3]=-4;
action[15][4]=-4;
action[15][7]=-4;
action[15][8]=-4;
action[16][1]=-5;
action[16][2]=-5;
action[16][3]=-5;
action[16][4]=-5;
action[16][7]=-5;
action[16][8]=-5;
Goto[0][0]=1;
Goto[3][1]=4;
Goto[6][1]=7;
Goto[9][1]=13;
Goto[10][1]=14;
Goto[11][1]=15;
Goto[12][1]=16;
derive[0][0]=11;
derive[0][1]=1;
derive[1][0]=9;
derive[1][1]=3;
derive[2][0]=10;
derive[2][1]=3;
derive[3][0]=10;
derive[3][1]=3;
derive[4][0]=10;
derive[4][1]=3;
derive[5][0]=10;
derive[5][1]=3;
derive[6][0]=10;
derive[6][1]=3;
derive[7][0]=10;
derive[7][1]=1;
addstate(0);
symbol x;
x.ID=8;
x.num=0;
addsymbol(x);
}
void Delete()
{
pstate--;
psymbol--;
}
void write(int reduce)
{
symbol msymbol=symbols[psymbol-1];
switch(msymbol.ID)
{
case 0:
fout2<<"i"<<msymbol.num<<"(";
break;
case 1:
fout2<<"+"<<"(";
break;
case 2:
fout2<<"-"<<"(";
break;
case 3:
fout2<<"*"<<"(";
break;
case 4:
fout2<<"/"<<"(";
break;
case 5:
fout2<<"="<<"(";
break;
case 6:
fout2<<"("<<"(";
break;
case 7:
fout2<<")"<<"(";
break;
case 9:
fout2<<"A"<<msymbol.num<<"(";
break;
case 10:
fout2<<"E"<<msymbol.num<<"(";
break;
}
switch(reduce)
{
case 9:
fout2<<"A"<<(1+Anum)<<")\n";
break;
case 10:
fout2<<"E"<<(1+Enum)<<")\n";
break;
}
}
int getNum(int x)
{
int mnum;
if(x==9)
{
Anum++;
mnum=Anum;
}
if(x==10)
{
Enum++;
mnum=Enum;
}
return mnum;
}
void parsetree()
{
//for(int i=0;i<SNum;i++)
//cout<<String[i]<<endl;
initTable();
while(1)
{
if(-8<=String[Readhead]&&String[Readhead]<=-1)//termination except i
{
//cout<<"1 "<<state[pstate-1]<<endl;
//fout2<<pstate<<endl;
//cout<<" "<<String[Readhead]<<endl;
if(action[state[pstate-1]][-String[Readhead]]<0)
{
int de=derive[-action[state[pstate-1]][-String[Readhead]]][0];
int de1=derive[-action[state[pstate-1]][-String[Readhead]]][1];
for(int i=0;i<de1;i++)
{
write(de);
Delete();
}
symbol sy;
//cout<<state[pstate-1]<<endl;
//cout<<-String[Readhead]<<endl;
sy.ID=de;
sy.num=getNum(sy.ID);
addsymbol(sy);
//cout<<"id"<<sy.ID<<endl;
//cout<<Goto[state[pstate-1]][sy.ID-9]<<endl;
addstate(Goto[state[pstate-1]][sy.ID-9]);
}
else if(action[state[pstate-1]][-String[Readhead]]>0)
{
symbol sy;
sy.ID=-String[Readhead];
sy.num=0;
addsymbol(sy);
addstate(action[state[pstate-1]][-String[Readhead]]);
Readhead++;
}
else
return;
}
else if(String[Readhead]<-8)//num
{
fout2<<(-(String[Readhead]+9))<<"(i";
if(Inum!=0)
fout2<<Inum<<")\n";
else
fout2<<")\n";
symbol sy;
sy.ID=0;
sy.num=Inum;
addsymbol(sy);
addstate(action[state[pstate-1]][0]);
Inum++;
Readhead++;
}
else if(String[Readhead]>0)//id
{
//cout<<symtable[String[Readhead]-1].lexptr<<endl;
fout2<<symtable[String[Readhead]-1].lexptr<<"(i";
if(Inum!=0)
fout2<<Inum<<")\n";
else
fout2<<")\n";
symbol sy;
sy.ID=0;
sy.num=Inum;
addsymbol(sy);
addstate(action[state[pstate-1]][0]);
Inum++;
Readhead++;
}
else
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -