📄 pl0.cpp
字号:
#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 + -