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

📄 pl0.cpp

📁 用VC写的扩充的pl0文法编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include"Global.h"

using namespace std;

void PL0::Int_error()
{
	errorMESS.push_back("01:应为=而不是:=");
	errorMESS.push_back("02:=后应为字符,整数或实数");
	errorMESS.push_back("03:标识符之后应为=");
	errorMESS.push_back("04:const,var,procedure,function后应为标示符");
	errorMESS.push_back("05:漏掉逗号或分号");
	errorMESS.push_back("06:过程或函数说明后的符号不正确");
	errorMESS.push_back("07:应为语句");
	errorMESS.push_back("08:程序体内语句部分后的符号不正确");
	errorMESS.push_back("09:应为句号");
	errorMESS.push_back("10:语句之后漏分号");
	errorMESS.push_back("11:标识符未说明或本层不可见");
	errorMESS.push_back("12:不可向常量或过程赋值");
	errorMESS.push_back("13:应为赋值运算符");
	errorMESS.push_back("14:call后应为标识符");
	errorMESS.push_back("15:不可调用常量或变量");
	errorMESS.push_back("16:应为then");
	errorMESS.push_back("17:应为分号或end");
	errorMESS.push_back("18:应为do");
	errorMESS.push_back("19:语句后的符号不正确");
	errorMESS.push_back("20:应为关系运算符");
	errorMESS.push_back("21:表达式内不可用过程标识符");
	errorMESS.push_back("22:漏右括号");
	errorMESS.push_back("23:因子后不可为此符号");
	errorMESS.push_back("24:表达式不能以此符号开始");
	errorMESS.push_back("25:实数格式不对");
	errorMESS.push_back("26:程序中字符串过长");
	errorMESS.push_back("27:字符串不允许为空串");
	errorMESS.push_back("28:标识符重复定义");
	errorMESS.push_back("29:缺少冒号");
	errorMESS.push_back("30:这个数太大");
	errorMESS.push_back("31:变量声明缺少类型标识符");
	errorMESS.push_back("32:形式参数不能为空");
	errorMESS.push_back("33:缺少参数类型说明符");
	errorMESS.push_back("40:应为左括号");
	errorMESS.push_back("41:缺少右括号')'");
	errorMESS.push_back("42:缺少函数名");
	errorMESS.push_back("43:分程序嵌套层次超过最大层数3");
	
	
}

void PL0::Int_word()
{
	strcpy(word[0],"");
	strcpy(word[1],"begin");
	strcpy(word[2],"char");
	strcpy(word[3],"const");
	strcpy(word[4],"do");
	strcpy(word[5],"downto");
	strcpy(word[6],"else");
	strcpy(word[7],"end");
	strcpy(word[8],"for");
	strcpy(word[9],"function");
	strcpy(word[10],"if");
	strcpy(word[11],"integer");
	strcpy(word[12],"procedure");
	strcpy(word[13],"read");
	strcpy(word[14],"real");
	strcpy(word[15],"repeat");
	strcpy(word[16],"then");
	strcpy(word[17],"to");
	strcpy(word[18],"until");
	strcpy(word[19],"var");
	strcpy(word[20],"while");
	strcpy(word[21],"write");
	
}

void PL0::Int_wsym()
{
	wsym[1]=BEGINSYM;
	wsym[2]=CHARSYM;
	wsym[3]=CONSTSYM;
	wsym[4]=DOSYM;
	wsym[5]=DOWNTOSYM;
	wsym[6]=ELSESYM;
	wsym[7]=ENDSYM;
	wsym[8]=FORSYM;
	wsym[9]=FUNCSYM;
	wsym[10]=IFSYM;
	wsym[11]=INTSYM;
	wsym[12]=PROCSYM;
	wsym[13]=READSYM;
	wsym[14]=REALSYM;
	wsym[15]=REPEAT;
	wsym[16]=THENSYM;
	wsym[17]=TOSYM;
	wsym[18]=UNTIL;
	wsym[19]=VARSYM;
	wsym[20]=WHILESYM;
	wsym[21]=WRITESYM;

}
void PL0::Int_ssym()
{
	///////////////////////////////////////////////////////////////////////////////////////////////////////
	ssym['+']=PLUS;                                                                                      //
	ssym['-']=MINUS;                                                                                     //
	ssym['*']=TIMES;                                                                                     //
	ssym['/']=SLASH;                                                                                     //
	ssym['(']=LPAREN;                                                                                    //
	ssym[')']=RPAREN;                                                                                    //
	ssym['=']=EQL;                                                                                       //
	ssym[',']=COMMA;                                                                                     //                                                                             //
	ssym['.']=PERIOD;                                                                                    //
	///////////////////////////////////////////////////////////////////////////////////////////////////////
}
void PL0::Int_mnemonic()
{
	strcpy(mnemonic[Lit]," lit ");
	strcpy(mnemonic[Opr]," opr ");
	strcpy(mnemonic[Lod]," lod ");
	strcpy(mnemonic[Sto]," sto ");
	strcpy(mnemonic[Int]," int ");
	strcpy(mnemonic[Jmp]," jmp ");
	strcpy(mnemonic[Jpc]," jpc ");
}

void PL0::Word_type()
{
	typedef map<SYMBOL,string>::value_type valType;
    //word_Type.insert(valType(EOL,string("EOL")));
	word_Type.insert(valType(NUL,string("NUL")));
	word_Type.insert(valType(IDENT,string("IDENT")));
	word_Type.insert(valType(INTSYM,string("INTSYM")));
	word_Type.insert(valType(REALSYM,string("REALSYM")));
	word_Type.insert(valType(CHARSYM,string("CHARSYM")));
	word_Type.insert(valType(INUM,string("INUM")));
	word_Type.insert(valType(RNUM,string("RNUM")));
	word_Type.insert(valType(PLUS,string("PLUS")));
	word_Type.insert(valType(MINUS,string("MINUS")));
	word_Type.insert(valType(TIMES,string("TIMES")));
	word_Type.insert(valType(SLASH,string("SLASH")));
	word_Type.insert(valType(EQL,string("EQL")));
	word_Type.insert(valType(NEQ,string("NEQ")));
	word_Type.insert(valType(LSS,string("LSS")));
	word_Type.insert(valType(LEQ,string("LEQ")));
	word_Type.insert(valType(GTR,string("GTR")));
	word_Type.insert(valType(GEQ,string("GEQ")));
	word_Type.insert(valType(LPAREN,string("LPAREN")));
	word_Type.insert(valType(RPAREN,string("RPAREN")));
	word_Type.insert(valType(COMMA,string("COMMA")));
	word_Type.insert(valType(SEMICOLON,string("SEMICOLON")));
	word_Type.insert(valType(PERIOD,string("PERIOD")));
	word_Type.insert(valType(BECOMES,string("BECOMES")));
	word_Type.insert(valType(BEGINSYM,string("BEGINSYM")));
	word_Type.insert(valType(ENDSYM,string("ENDSYM")));
	word_Type.insert(valType(IFSYM,string("IFSYM")));
	word_Type.insert(valType(THENSYM,string("THENSYM")));
	word_Type.insert(valType(ELSESYM,string("ELSESYM")));
	word_Type.insert(valType(WHILESYM,string("WHILESYM")));
	word_Type.insert(valType(DOSYM,string("DOSYM")));
	word_Type.insert(valType(FORSYM,string("FORSYM")));
	word_Type.insert(valType(DOWNTOSYM,string("DOWNTOSYM")));
	word_Type.insert(valType(TOSYM,string("TOSYM")));
	word_Type.insert(valType(WRITESYM,string("WRITESYM")));
	word_Type.insert(valType(READSYM,string("READSYM")));
	word_Type.insert(valType(CONSTSYM,string("CONSTSYM")));
	word_Type.insert(valType(VARSYM,string("VARSYM")));
	word_Type.insert(valType(PROCSYM,string("PROCSYM")));
	word_Type.insert(valType(FUNCSYM,string("FUNCSYM")));
	word_Type.insert(valType(REPEAT,string("REPEAT")));
	word_Type.insert(valType(UNTIL,string("UNTIL")));
	word_Type.insert(valType(COLON,string("COLON")));

}

void PL0::Typmap()
{
	typedef map<TYP,string>::value_type vt;
	typmap.insert(vt(notyp,string("notyp")));
	typmap.insert(vt(chars,string("chars")));
	typmap.insert(vt(ints,string("ints")));
	typmap.insert(vt(reals,string("reals")));
}

void PL0::Objmap()
{
	typedef map<OBJ,string>::value_type vt;
	objmap.insert(vt(CONSTANT,string("constant")));
	objmap.insert(vt(VARIABLE,string("variable")));
	objmap.insert(vt(PARAMETER,string("parameter")));
	objmap.insert(vt(PROCEDURE,string("procedure")));
	objmap.insert(vt(FUNCTION,string("function")));
}
void PL0::Fctmap()
{
	//{Lit,Liti,Opr,Lod,Lodf,Sto,Int,Jmp,Jpc}
	typedef map<FCT,string>::value_type vt;
	fctmap.insert(vt(Lit,string("lit")));
	//fctmap.insert(vt(Liti,string("liti")));
	fctmap.insert(vt(Opr,string("opr")));
	fctmap.insert(vt(Lod,string("lod")));
	fctmap.insert(vt(Loda,string("loda")));
	fctmap.insert(vt(Sto,string("sto")));
	fctmap.insert(vt(Red,string("red")));
	fctmap.insert(vt(Stoi,string("stoi")));
	fctmap.insert(vt(Int,string("int")));
	fctmap.insert(vt(Jmp,string("jmp")));
	fctmap.insert(vt(Jpc,string("jpc")));
	fctmap.insert(vt(Wrt,string("wrt")));
	fctmap.insert(vt(Wrts,string("wrts")));
	fctmap.insert(vt(F1U,string("F1U")));
	fctmap.insert(vt(F2U,string("F2U")));
	fctmap.insert(vt(F1D,string("F1D")));
	fctmap.insert(vt(F2D,string("F2D")));
	fctmap.insert(vt(Cal,string("cal")));
	fctmap.insert(vt(Fun,string("fun")));
	fctmap.insert(vt(Stof,string("stof")));
	//enum FCT {Lit,Opr,Lod,Loda,Sto,Stoi,Int,Jmp,Jpc,Red,Wrt,Wrts,Cal,F1U,F2U,F1D,F2D};
}
void PL0::Error(int n,int line)
{
	cout<<"Line"<<line<<": "<<errorMESS.at(--n)<<endl;
	err++;
}
void PL0::Error(string s,int line)
{
	cout<<"Line "<<line<<": "<<s<<endl;
	err++;
}
PL0::PL0(const char *source,const char *destination)
{
	listswitch=true;
    sourceEnd=false;
	ret=false;
	err=0;
	num=0.0f;
	cc=0;
	linecount=0;
	cx=0;
	tx=0;
	ll=0;
	ch=' ';
	kk=al;
	sentry=1;
	slength=0;
	bx=0;

	memset(code,0,sizeof(code));
	memset(table,0,sizeof(table));
	memset(line,0,sizeof(line));
	memset(str,0,tsmax);
	memset(DISPLAY,0,sizeof(DISPLAY));
	memset(btab,0,sizeof(btab));
	memset(s,0,stacksize);
	Int_error();
	Int_word();
	Int_wsym();
	Int_ssym();
	Int_mnemonic();
	Word_type();
	Typmap();
	Objmap();
	Fctmap();

	declbegsys.insert(CONSTSYM);
	declbegsys.insert(VARSYM);
	declbegsys.insert(PROCSYM);
	declbegsys.insert(FUNCSYM);

	statbegsys.insert(BEGINSYM);
	statbegsys.insert(IFSYM);
	statbegsys.insert(WHILESYM);
	statbegsys.insert(FORSYM);
	statbegsys.insert(READSYM);
	statbegsys.insert(REPEAT);
	statbegsys.insert(WRITESYM);

	facbegsys.insert(IDENT);
	facbegsys.insert(INUM);
	facbegsys.insert(RNUM);
	facbegsys.insert(LPAREN);
	fin=fopen(source,"r");
	fout=fopen(destination,"w");
	//PrintTable(tx);


}
PL0::~PL0()
{
}
void PL0::PrintBtab(int &bx)
{
	cout<<"bx= "<<bx<<endl;
	for(int i=1;i<=bx;i++)
	{
		cout<<"last"<<setw(5)<<"lastpar"<<setw(8)<<"psize"<<setw(5)<<"vsize"<<setw(5)<<endl;
		cout<<btab[i].last<<setw(5)<<btab[i].lastpar<<setw(6)<<btab[i].psize<<setw(5)<<btab[i].vsize<<setw(5)<<endl;
	}
	
	
}
void PL0::PrintTable(int &tx)
{
	cout<<"tx= "<<tx<<endl;
	cout<<"name"<<setw(7)<<"link"<<setw(5)<<"ref"<<setw(5)<<"type"<<setw(7)<<"level"<<setw(8)<<"value"<<setw(5)<<"adr"<<setw(8)<<"kind"<<endl;
	for(int i=1;i<=tx;i++)
	{
		cout<<table[i].name<<setw(9-strlen(table[i].name))<<table[i].link<<setw(5)<<table[i].ref<<setw(8)<<typmap[table[i].type]<<setw(5)<<table[i].level<<setw(8)<<table[i].val<<setw(5)<<table[i].adr<<setw(12)<<objmap[table[i].kind]<<endl;
	}
}
void PL0::Warning(string s,int line)
{
	cout<<"warning: Line"<<line<<": "<<s<<endl;
}
void PL0::Enterblock(int &bx)
{
	if(bx==bxmax)
		return;
	else
	{
		bx++;
		btab[bx].last=0;
		btab[bx].lastpar=0;
	}
}
int PL0::Getch()
{
	if(fin==NULL)
	{
		printf("无法打开源文件");
		exit(1);
	}
	else
	{
		if(cc==ll)
		{
			if(feof(fin))
			{
				sourceEnd=true;
			}
			else
			{
				cc=0;
				memset(line,0,101);
				do
				{
					fgets(line,101,fin);
					linecount++;		
				}while(line[0]=='\n');
				ll=(int)strlen(line);
				if(line[ll-1]!='\n')
					line[ll++]='/n';
				//cout<<line;
			}

		}else
			if(cc+1==ll)
				ch=0,cc++;
			else
				ch=line[cc++];
	}
}

int PL0::Getsym()
{
	int i,j,k,flag;
	double e;
	if(sourceEnd)
		return 1;

	while(ch==' '||ch==9||ch==0)
		Getch();

	if(('a'<=ch&&ch<='z')||('A'<=ch&&ch<='Z'))
	{
		k=0;
		memset(a,0,al+1);
		do
		{
			if(k<al)
				a[k++]=ch;
			//if(cc!=ll)
				//Getch();
			Getch();
		}while(('a'<=ch&&ch<='z')||('A'<=ch&&ch<='Z')||('0'<=ch&&ch<='9'));
		strcpy(id,a);
		i=1,j=norw;
		do
		{
			k=(i+j)/2;
			if(strcmp(id,word[k])<=0)
				j=k-1;
			if(strcmp(id,word[k])>=0)
				i=k+1;
		}while(i<=j);
		if(i-1>j)
			sym=wsym[k];
		else
			sym=IDENT;
		//cout<<"id:"<<id<<setw(12)<<word_Type[sym]<<endl;
	}
	else
		if('0'<=ch&&ch<='9')
		{
			k=0;
		    num=0.0f;
		    sym=INUM;
			do
			{
				num=10*num+(ch-'0');
			    ++k;
				//if(cc!=ll)
					//Getch();
			    Getch();
	    	}while('0'<=ch&&ch<='9');
			if(k>nmax||num>amax)
			{
			    //errorMESS(21,linecount);
				num=0;
			}
			//cout<<"num: "<<num<<setw(12)<<word_Type[sym]<<endl;
			if(ch=='.')
			{
				//if(cc!=ll)
					//Getch();
				Getch();
			    sym=RNUM;
			    flag=0;
			    e=0.1f;
			    while('0'<=ch&&ch<='9')
				{
					flag--;
					k++;
					num=num+e*(ch-'0');
                    //if(cc!=ll)
						//Getch();
					Getch();
					e=e*e;
				}
				if(flag==0||k>nmax||num>amax)
				{
					Error(22,linecount);
					num=0.0f;
					sym=NUL;
				}
					
			}
			//cout<<"num: "<<num<<setw(12)<<word_Type[sym]<<endl;
		}
		else
			if(ch=='<')
			{
				//if(cc!=ll)
					//Getch();
				Getch();
				if(ch=='=')
				{
					sym=LEQ;
					//if(cc!=ll)
						//Getch();
					Getch();
				}
				else
					if(ch=='>')
					{
						sym=NEQ;
						//if(cc!=ll)
							//Getch();
					    Getch();
			     	}
					else
						sym=LSS;
				//cout<<"symbol:"<<ch<<setw(12)<<word_Type[sym]<<endl;
			}
			else 
				if(ch=='>')
				{
					Getch();
					if(ch=='=')
					{
						sym=GTR;
						//if(cc!=ll)
							//Getch();
						Getch();
					}
					else
						sym=GEQ;
					//cout<<"symbol:"<<ch<<setw(12)<<word_Type[sym]<<endl;
				}
				else 
					if(ch==':')
					{
						//if(cc!=ll)
							//Getch();
						Getch();
						if(ch=='=')
						{
							//if(cc!=ll)
								//Getch();
							Getch();
							sym=BECOMES;
						}
						else
							sym=COLON;
						//cout<<"symbol:"<<ch<<setw(12)<<word_Type[sym]<<endl;
					}
					else if(ch=='"')
					{
						sym=STRING;
						Getch();
						sleng=slength;
						while(ch!='"')
						{
							slength++;
							if(slength>=tsmax)
								Error(26,linecount);//程序中字符串过长

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -