📄 parsingtable.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 + -