📄 pl0.cpp
字号:
gen(sto,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
}
else
{
if(sym==readsym)
{
getsym();
if(sym!=lparen)
error(34);
else
{
do
{
getsym();
if(sym==ident)
i=position(id,tx);
else
i=0;
if(i==0)
error(35);
else
{
gen(opr,0,16);
gen(sto,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
}
getsym();
}while(sym==comma);
if(sym!=rparen)
{
error(33);
while(!insymbol(fsys))
getsym();
}
else
getsym();
}
}
else
{
if(sym==writesym)
{
getsym();
if(sym==lparen)
{
reset(ss);
additem(ss,rparen);
additem(ss,comma);
mergeset(ss,fsys);
do
{
getsym();
expression(ss,tx,lev);
gen(opr,0,14);
}while(sym==comma);
if(sym!=rparen)
error(33);
else
getsym();
}
gen(opr,0,15);
}
else
{
if(sym==callsym)
{
getsym();
if(sym!=ident)
error(14);
else
{
i=position(id,tx);
if(i==0)
error(11);
else
if(table[i].kind=procedur)
gen(cal,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
else
error(15);
getsym();
}
}
else
{
if(sym==ifsym)
{
getsym();
reset(ss);
additem(ss,thensym);
additem(ss,dosym);
mergeset(ss,fsys);
condition(ss,tx,lev);
if(sym==thensym)
getsym();
else
error(16);
cx1=cx;
gen(jpc,0,0);
statement(fsys,tx,lev);
code[cx].a=cx;
}
else
{
if(sym==beginsym)
{
getsym();
reset(ss);
additem(ss,semicolon);
additem(ss,endsym);
mergeset(ss,fsys);
statement(ss,tx,lev);
reset(ss);
additem(ss,semicolon);
mergeset(ss,statbegsys);
while(insymbol(ss))
{
if(sym==semicolon)
getsym();
else
error(10);
reset(ss);
additem(ss,semicolon);
additem(ss,endsym);
mergeset(ss,fsys);
statement(ss,tx,lev);
reset(ss);
additem(ss,semicolon);
mergeset(ss,statbegsys);
}
if(sym==endsym)
getsym();
else
error(17);
}
else
{
if(sym==whilesym)
{
cx1=cx;
getsym();
reset(ss);
additem(ss,dosym);
mergeset(ss,fsys);
condition(ss,tx,lev);
cx2=cx;
gen(jpc,0,0);
if(sym==dosym)
getsym();
else
error(18);
statement(fsys,tx,lev);
gen(jmp,0,cx1);
code[cx2].a=cx;
}
}
}
}
}
}
}
reset(ss);
test(fsys,ss,19);
}
void expression (symset fsys,int tx,int lev)
{
symbol addop;
symset ss;
reset(ss);
additem(ss,plus);
additem(ss,minus);
if(insymbol(ss))
{
addop=sym;
getsym();
mergeset(ss,fsys);
term(ss,tx,lev);
if(addop==minus)
gen(opr,0,1);
}
else
{
mergeset(ss,fsys);
term(ss,tx,lev);
}
reset(ss);
additem(ss,plus);
additem(ss,minus);
while(insymbol(ss))
{
addop=sym;
getsym();
mergeset(ss,fsys);
term(ss,tx,lev);
if(addop==plus)
gen(opr,0,2);
else
gen(opr,0,3);
reset(ss);
additem(ss,plus);
additem(ss,minus);
}
}
void term (symset fsys,int tx,int lev)
{
symbol mulop;
symset ss;
reset(ss);
additem(ss,times);
additem(ss,slash);
mergeset(ss,fsys);
factor(ss,tx,lev);
reset(ss);
additem(ss,times);
additem(ss,slash);
while(insymbol(ss))
{
mulop=sym;
getsym();
reset(ss);
additem(ss,times);
additem(ss,slash);
mergeset(ss,fsys);
factor(ss,tx,lev);
if(mulop==times)
gen(opr,0,4);
else
gen(opr,0,5);
reset(ss);
additem(ss,times);
additem(ss,slash);
}
}
void factor(symset fsys,int tx,int lev)
{
int i;
symset ss;
test(facbegsys,fsys,24);
while(insymbol(facbegsys))
{
if(sym==ident)
{
i=position(id,tx);
if(i==0)
error(11);
else
switch(table[i].kind)
{
case constant:
gen(lit,0,table[i].cvp.val);
break;
case variable:
gen(lod,lev-table[i].cvp.vp.level,table[i].cvp.vp.adr);
break;
case procedur:
error(21);
}
getsym();
}
else
{
if(sym==number)
{
if(num>amax)
{
error(31);
num=0;
}
gen(lit,0,num);
getsym();
}
else
{
if(sym==lparen)
{
getsym();
reset(ss);
additem(ss,rparen);
mergeset(ss,fsys);
expression(ss,tx,lev);
if(sym==rparen)
getsym();
else
error(22);
}
}
}
test(fsys,facbegsys,23);
}
}
void condition (symset fsys,int tx,int lev)
{
symbol relop;
symset ss;
if(sym==oddsym)
{
getsym();
expression(fsys,tx,lev);
gen(opr,0,6);
}
else
{
reset(ss);
additem(ss,eql);
additem(ss,neq);
additem(ss,lss);
additem(ss,leq);
additem(ss,gtr);
additem(ss,geq);
mergeset(ss,fsys);
expression(ss,tx,lev);
reset(ss);
additem(ss,eql);
additem(ss,neq);
additem(ss,lss);
additem(ss,leq);
additem(ss,gtr);
additem(ss,geq);
if(!insymbol(ss))
error(20);
else
{
relop=sym;
getsym();
expression(fsys,tx,lev);
switch(relop)
{
case eql:
gen(opr,0,8);
break;
case neq:
gen(opr,0,9);
break;
case lss:
gen(opr,0,10);
break;
case geq:
gen(opr,0,11);
break;
case gtr:
gen(opr,0,12);
break;
case leq:
gen(opr,0,13);
}
}
}
}
void interpret ()
{
int p,b,t;
instruction i;
int s[stacksize+1];
printf("start pl0\n");
t=0;
b=1;
p=0;
s[1]=0;
s[2]=0;
s[3]=0;
do
{
i=code[p];
p++;
switch(i.f)
{
case lit:
t++;
s[t]=i.a;
break;
case opr:
switch(i.a)
{
case 0:
t=b-1;
p=s[t+3];
b=s[t+2];
break;
case 1:
s[t]=-s[t];
break;
case 2:
t--;
s[t]+=s[t+1];
break;
case 3:
t--;
s[t]-=s[t+1];
break;
case 4:
t--;
s[t]*=s[t+1];
break;
case 5:
t--;
s[t]/=s[t+1];
break;
case 6:
if(s[t]%2)
s[t]=1;
else
s[t]=0;
break;
case 8:
t--;
if(s[t]==s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 9:
t--;
if(s[t]!=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 10:
t--;
if(s[t]<s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 11:
t--;
if(s[t]>=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 12:
t--;
if(s[t]>s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 13:
t--;
if(s[t]<=s[t+1])
s[t]=1;
else
s[t]=0;
break;
case 14:
printf(" %d",s[t]);
fprintf(fa2," %d",s[t]);
t--;
break;
case 15:
printf("\n");
fprintf(fa2,"\n");
break;
case 16:
t++;
printf("?");
fprintf(fa2,"?");
scanf("%d",&s[t]);
fprintf(fa2,"%d",s[t]);
}
break;
case lod:
t++;
s[t]=s[base(i.l,b,s)+i.a];
break;
case sto:
s[base(i.l,b,s)+i.a]=s[t];
t--;
break;
case cal:
s[t+1]=base(i.l,b,s);
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=i.a;
break;
case int0:
t+=i.a;
break;
case jmp:
p=i.a;
break;
case jpc:
if(!s[t])
p=i.a;
t--;
break;
}
}while(p!=0);
fclose(fa2);
}
int base (int l,int b,int s[])
{
int b1;
b1=b;
while(l>0)
{
b1=s[b1];
l--;
}
return b1;
}
int main ()
{
symset ss;
for(ch=0;ch<62;ch++)
ssym[ch]=nul;
strcpy(word[1],"begin ");
word[1][9]=' ';
strcpy(word[2],"call ");
word[2][9]=' ';
strcpy(word[3],"const ");
word[3][9]=' ';
strcpy(word[4],"do ");
word[4][9]=' ';
strcpy(word[5],"end ");
word[5][9]=' ';
strcpy(word[6],"if ");
word[6][9]=' ';
strcpy(word[7],"odd ");
word[7][9]=' ';
strcpy(word[8],"procedure");
word[8][9]=' ';
strcpy(word[9],"read ");
word[9][9]=' ';
strcpy(word[10],"then ");
word[10][9]=' ';
strcpy(word[11],"var ");
word[11][9]=' ';
strcpy(word[12],"while ");
word[12][9]=' ';
strcpy(word[13],"write ");
word[13][9]=' ';
wsym[1]=beginsym;
wsym[2]=callsym;
wsym[3]=constsym;
wsym[4]=dosym;
wsym[5]=endsym;
wsym[6]=ifsym;
wsym[7]=oddsym;
wsym[8]=procsym;
wsym[9]=readsym;
wsym[10]=thensym;
wsym[11]=varsym;
wsym[12]=whilesym;
wsym[13]=writesym;
ssym['+']=plus;
ssym['-']=minus;
ssym['*']=times;
ssym['/']=slash;
ssym['(']=lparen;
ssym[')']=rparen;
ssym['=']=eql;
ssym[',']=comma;
ssym['.']=period;
ssym['#']=neq;
ssym[';']=semicolon;
strcpy(mnemonic[lit],"lit ");
// mnemonic[lit][4]=' ';
strcpy(mnemonic[opr],"opr ");
// mnemonic[opr][4]=' ';
strcpy(mnemonic[lod],"lod ");
// mnemonic[lod][4]=' ';
strcpy(mnemonic[sto],"sto ");
// mnemonic[sto][4]=' ';
strcpy(mnemonic[cal],"cal ");
// mnemonic[cal][4]=' ';
strcpy(mnemonic[int0],"int0");
// mnemonic[int0][4]=' ';
strcpy(mnemonic[jmp],"jmp ");
// mnemonic[jmp][4]=' ';
strcpy(mnemonic[jpc],"jpc ");
// mnemonic[jpc][4]=' ';
reset(declbegsys);
additem(declbegsys,constsym);
additem(declbegsys,varsym);
additem(declbegsys,procsym);
reset(statbegsys);
additem(statbegsys,beginsym);
additem(statbegsys,callsym);
additem(statbegsys,ifsym);
additem(statbegsys,whilesym);
reset(facbegsys);
additem(facbegsys,ident);
additem(facbegsys,number);
additem(facbegsys,lparen);
// printf("input file: ");
// fprintf(fa1,"input file: ");
// scanf("%s",fname);
// fprintf(fa1,"%s\n",fname);
if((fin=fopen("fin.txt","r"))==NULL)
{
printf("Can't open fin.txt");
return 0;
}
if((fa=fopen("fa.txt","w"))==NULL)
{
printf("Can't open fa.txt");
return 0;
}
if((fa1=fopen("fa1.txt","w"))==NULL)
{
printf("Can't open fa1.txt");
return 0;
}
if((fa2=fopen("fa2.txt","w"))==NULL)
{
printf("Can't open fa2.txt");
return 0;
}
// printf("list object code? ");
// scanf("%s",fname);
// fprintf(fa1,"list object code? %c",fname[0]);
// listswitch=(fname[0]=='y');
listswitch=1;
err=0;
cc=0;
cx=0;
ll=0;
ch=' ';
kk=al;
getsym();
reset(ss);
additem(ss,period);
mergeset(ss,declbegsys);
mergeset(ss,statbegsys);
block(0,0,ss);
fclose(fa);
fclose(fa1);
if(sym!=period)
error(9);
if(err==0)
interpret();
else
printf("errors in pl0 program");
printf("end pl0\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -