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

📄 parsingtable.cpp

📁 这是我们老师给我们的例子
💻 CPP
字号:
#include "stdafx.h"

using namespace std;



string transfer(string token)
{
	if(token=="P")
	{
		return "Program";
	}
	else if(token=="CS")
	{
		return "CompoundStmt";
	}
	else if(token=="S")
	{
		return "Stmt";
	}
	else if(token=="SS")
	{
		return "Stmts";
	}
	else if(token=="IS")
	{
		return "IfStmt";
	}
	else if(token=="WS")
	{
		return "WhileStmt";
	}
	else if(token=="AS")
	{
		return "AssigStmt";
	}
	else if(token=="BE")
	{
		return "BoolExpr";
	}
	else if(token=="BO")
	{
		return "BoolOp";
	}
	else if(token=="AE")
	{
		return "ArithExpr";
	}
	else if(token=="AEP")
	{
		return "ArithExprPrime";
	}
	else if(token=="ME")
	{
		return "MulExpr";
	}
	else if(token=="MEP")
	{
		return "MulExprPrime";
	}
	else if(token=="SE")
	{
		return "SimpleExpr";
	}
	else if(token=="lb")
	{
		return "{";
	}
	else if(token=="rb")
	{
		return "}";
	}
	else if(token=="lp")
	{
		return "(";
	}
	else if(token=="rp")
	{
		return ")";
	}
	else if(token=="smc")
	{
		return ";";
	}
	else if(token=="if")
	{
		return "if";
	}
	else if(token=="then")
	{
		return "then";
	}
	else if(token=="else")
	{
		return "else";
	}
	else if(token=="while")
	{
		return "while";
	}
	else if(token=="id")
	{
		return "id";
	}
	else if(token=="num")
	{
		return "num";
	}
	else if(token=="lt")
	{
		return "<";
	}
	else if(token=="gt")
	{
		return ">";
	}
	else if(token=="le")
	{
		return "<=";
	}
	else if(token=="ge")
	{
		return ">=";
	}
	else if(token=="as")
	{
		return "=";
	}
	else if(token=="eq")
	{
		return "==";
	}
	else if(token=="plus")
	{
		return "+";
	}
	else if(token=="minus")
	{
		return "-";
	}
	else if(token=="mul")
	{
		return "*";
	}
	else if(token=="div")
	{
		return "/";
	}
	else if(token=="ne")
	{
		return "!=";
	}
	else if(token=="dl")
	{
		return "$";
	}
	else if(token=="empty")
	{
		return "ε";
	}
	else 
	{
		return "unknow";
	}
}

string transSeq(string pro)
{
	string output="";
	int pos;
	string temp="";
	for(pos=0;pos<pro.length();pos++)
	{
		if(pro[pos]!=' ')
		{
			temp=temp+pro[pos];
		}
		else
		{
			if(output=="")
			{
				output=transfer(temp);
			}
			else
			{
				output=output+" "+transfer(temp);
			}
			temp="";
		}
	}
	if(output=="")
	{
		output=transfer(temp);
	}
	else
	{
	output=output+" "+transfer(temp);
	}
	return output;
}

ParsingTable::ParsingTable()
{}

void ParsingTable::initialize()
{
	this->errorArray=new string[2];
	errorArray[0]="Unexpected";
	errorArray[1]="Missing";
	unexpect=new parsingTableEntry;
	unexpect->errorM=errorArray;
	missing=new parsingTableEntry;
	missing->entry="SYCN";
	empty=new parsingTableEntry;
	empty->entry="empty";
	missing->errorM=errorArray+1;
	parTable[P][lb].entry="CS";
	parTable[P][dl].entry="SYCN";
	parTable[P][dl].errorM=errorArray+1;

	parTable[CS][lb].entry="lb SS rb";
	parTable[CS][dl].entry="SYCN";
	parTable[CS][dl].errorM=errorArray+1;

	parTable[S][lb].entry="CS";
	parTable[S][rb].entry="SYCN";
	parTable[S][rb].errorM=errorArray+1;
	parTable[S][tif].entry="IS";
	parTable[S][telse].entry="SYCN";
	parTable[S][telse].errorM=errorArray+1;
	parTable[S][twhile].entry="WS";
	parTable[S][id].entry="AS";
	parTable[S][dl].entry="SYCN";
	parTable[S][dl].errorM=errorArray+1;

	parTable[SS][lb].entry="S SS";
	parTable[SS][rb].entry="empty";
	parTable[SS][tif].entry="S SS";
	parTable[SS][telse].entry="empty";
	parTable[SS][twhile].entry="S SS";
	parTable[SS][id].entry="S SS";
	parTable[SS][dl].entry="empty";

	parTable[IS][rb].entry="SYCN";
	parTable[IS][rb].errorM=errorArray+1;
	parTable[IS][tif].entry="if lp BE rp then S else S";
	parTable[IS][telse].entry="SYCN";
	parTable[IS][telse].errorM=errorArray+1;
	parTable[IS][dl].entry="SYCN";
	parTable[IS][dl].errorM=errorArray+1;

	parTable[WS][rb].entry="SYCN";
	parTable[WS][rb].errorM=errorArray+1;
	parTable[WS][telse].entry="SYCN";
	parTable[WS][telse].errorM=errorArray+1;
	parTable[WS][twhile].entry="while lp BE rp S";
	parTable[WS][dl].entry="SYCN";
	parTable[WS][dl].errorM=errorArray+1;

	parTable[AS][id].entry="id as AE smc";
	parTable[AS][dl].entry="SYCN";
	parTable[AS][dl].errorM=errorArray+1;

	parTable[BE][lp].entry="AE BO AE";
	parTable[BE][rp].entry="SYCN";
	parTable[BE][rp].errorM=errorArray+1;
	parTable[BE][smc].entry="SYCN";
	parTable[BE][smc].errorM=errorArray+1;
	parTable[BE][id].entry="AE BO AE";
	parTable[BE][num].entry="AE BO AE";
	parTable[BE][dl].entry="SYCN";
	parTable[BE][dl].errorM=errorArray+1;

	parTable[BO][lp].entry="SYCN";
	parTable[BO][lp].errorM=errorArray+1;
	parTable[BO][id].entry="SYCN";
	parTable[BO][id].errorM=errorArray+1;
	parTable[BO][num].entry="SYCN";
	parTable[BO][num].errorM=errorArray+1;
	parTable[BO][lt].entry="lt";
	parTable[BO][gt].entry="gt";
	parTable[BO][le].entry="le";
	parTable[BO][ge].entry="ge";
	parTable[BO][as].entry="as";
	parTable[BO][eq].entry="eq";
	parTable[BO][ne].entry="ne";
	parTable[BO][dl].entry="SYCN";
	parTable[BO][dl].errorM=errorArray+1;

	parTable[AE][lp].entry="ME AEP";
	parTable[AE][rp].entry="SYCN";
	parTable[AE][rp].errorM=errorArray+1;
	parTable[AE][smc].entry="SYCN";
	parTable[AE][smc].errorM=errorArray+1;
	parTable[AE][id].entry="ME AEP";
	parTable[AE][num].entry="ME AEP";
	parTable[AE][dl].entry="SYCN";
	parTable[AE][dl].errorM=errorArray+1;

	parTable[AEP][rp].entry="empty";
	parTable[AEP][smc].entry="empty";
	parTable[AEP][plus].entry="plus ME AEP";
	parTable[AEP][minus].entry="minus ME AEP";
	parTable[AEP][dl].entry="empty";
	parTable[AEP][lt].entry="empty";
	parTable[AEP][gt].entry="empty";
	parTable[AEP][le].entry="empty";
	parTable[AEP][ge].entry="empty";
	parTable[AEP][eq].entry="empty";
	parTable[AEP][ne].entry="empty";

	parTable[ME][lp].entry="SE MEP";
	parTable[ME][rp].entry="SYCN";
	parTable[ME][rp].errorM=errorArray+1;
	parTable[ME][smc].entry="SYCN";
	parTable[ME][smc].errorM=errorArray+1;
	parTable[ME][id].entry="SE MEP";
	parTable[ME][num].entry="SE MEP";
	parTable[ME][dl].entry="SYCN";
	parTable[ME][dl].errorM=errorArray+1;

	parTable[MEP][rp].entry="empty";
	parTable[MEP][smc].entry="empty";
	parTable[MEP][tif].entry="SYCN";
	parTable[MEP][tif].errorM=errorArray+1;
	parTable[MEP][mul].entry="mul SE MEP";
	parTable[MEP][di].entry="div SE MEP";
	parTable[MEP][dl].entry="empty";
	parTable[MEP][lt].entry="empty";
	parTable[MEP][gt].entry="empty";
	parTable[MEP][le].entry="empty";
	parTable[MEP][ge].entry="empty";
	parTable[MEP][eq].entry="empty";
	parTable[MEP][ne].entry="empty";
	parTable[MEP][plus].entry="empty";
	parTable[MEP][minus].entry="empty";

	parTable[SE][lp].entry="lp AE rp";
	parTable[SE][rp].entry="SYCN";
	parTable[SE][rp].errorM=errorArray+1;
	parTable[SE][smc].entry="SYCN";
	parTable[SE][smc].errorM=errorArray+1;
	parTable[SE][id].entry="id";
	parTable[SE][num].entry="num";
	parTable[SE][dl].entry="SYCN";
	parTable[SE][dl].errorM=errorArray+1;
}

parsingTableEntry* ParsingTable::search(string non,string ter)
{
		if(non=="P")
		{
				if(ter=="lb")
					return &parTable[P][lb];
				else if(ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="CS")
		{
				if(ter=="lb")
					return &parTable[CS][lb];
				else if(ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="S")
		{
				if(ter=="lb")
					return &parTable[S][lb];
				else if(ter=="if")
					return &parTable[S][tif];
				else if(ter=="while")
					return &parTable[S][twhile];
				else if(ter=="id")
					return &parTable[S][id];
				else if(ter=="rb"||ter=="else"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="SS")
		{
				if(ter=="lb")
					return &parTable[SS][lb];
				else if(ter=="if")
					return &parTable[SS][tif];
				else if(ter=="while")
					return &parTable[SS][twhile];
				else if(ter=="id")
					return &parTable[SS][id];
				else if(ter=="rb"||ter=="else"||ter=="dl")
					return empty;
				else
					return unexpect;
		}
		else if(non=="IS")
		{
				if(ter=="if")
					return &parTable[IS][tif];
				else if(ter=="rb"||ter=="else"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="WS")
		{
				if(ter=="while")
					return &parTable[WS][twhile];
				else if(ter=="rb"||ter=="else"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="AS")
		{
				if(ter=="id")
					return &parTable[AS][id];
				else if(ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="BE")
		{
				if(ter=="lp")
					return &parTable[BE][lp];
				else if(ter=="id")
					return &parTable[BE][id];
				else if(ter=="num")
					return &parTable[BE][num];
				else if(ter=="rp"||ter=="smc"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="BO")
		{
				if(ter=="lt")
					return &parTable[BO][lt];
				else if(ter=="gt")
					return &parTable[BO][gt];
				else if(ter=="le")
					return &parTable[BO][le];
				else if(ter=="ge")
					return &parTable[BO][ge];
				else if(ter=="as")
					return &parTable[BO][as];
				else if(ter=="eq")
					return &parTable[BO][eq];
				else if(ter=="ne")
					return &parTable[BO][ne];
				else if(ter=="lp"||ter=="id"||ter=="num"||ter=="dl")
					return missing;
				else
					return unexpect;
			}
		else if(non=="AE")
		{
				if(ter=="lp")
					return &parTable[AE][lp];
				else if(ter=="id")
					return &parTable[AE][id];
				else if(ter=="num")
					return &parTable[AE][num];
				else if(ter=="rp"||ter=="smc"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="AEP")
		{
				if(ter=="plus")
					return &parTable[AEP][plus];
				else if(ter=="minus")
					return &parTable[AEP][minus];
				else if(ter=="rp"||ter=="smc"||ter=="dl"||ter=="lt"
						||ter=="gt"||ter=="le"||ter=="ge"||ter=="eq"||ter=="ne")
					return empty;
				else
					return unexpect;
		}
		else if(non=="ME")
		{
				if(ter=="lp")
					return &parTable[ME][lp];
				else if(ter=="id")
					return &parTable[ME][id];
				else if(ter=="num")
					return &parTable[ME][num];
				else if(ter=="rp"||ter=="smc"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else if(non=="MEP")
		{
				if(ter=="mul")
					return &parTable[MEP][mul];
				else if(ter=="div")
					return &parTable[MEP][di];
				else if(ter=="rp"||ter=="smc"||ter=="dl"||ter=="lt"||ter=="minus"
						||ter=="gt"||ter=="le"||ter=="ge"||ter=="eq"||ter=="ne"||ter=="plus")
					return empty;
				else if(ter=="tif")
					return missing;
				else
					return unexpect;
		}
		else if(non=="SE")
		{
				if(ter=="lp")
					return &parTable[SE][lp];
				else if(ter=="id")
					return &parTable[SE][id];
				else if(ter=="num")
					return &parTable[SE][num];
				else if(ter=="rp"||ter=="smc"||ter=="dl")
					return missing;
				else
					return unexpect;
		}
		else
		{
			return unexpect;
		}
}

ParsingTable::~ParsingTable()
{
	delete[] errorArray;
	delete empty;
	delete missing;
	delete unexpect;
}

⌨️ 快捷键说明

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