⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.cpp

📁 编译原理课程设计中的词法和语法分析器的设计
💻 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 + -