📄 yufa.cpp
字号:
addop=sym;//............................
sym=getsym(fin);
term(fin);
if(addop=minus)//................................
gen(opr,0,1);//..............................
}
else
{
term(fin);
}
while(sym==plus||sym==minus)
{
addop=sym;
//读下个单词
sym=getsym(fin);
term(fin);
if(addop==plus)
gen(opr,0,2);
else
gen(opr,0,3);
}
}
void term(FILE *fin)//项的实现
{
symbol mulop;
factor(fin);
while(sym==times||sym==slash)
{
mulop=sym;//.......................................
//读下个单词
sym=getsym(fin);
factor(fin);
if(mulop==times)
gen(opr,0,4);
else
gen(opr,0,5);
}
}
void factor(FILE *fin)//因子的实现
{
int p;
if(sym!=ident)
{
if(sym!=number)
{
if(sym==lparen)
{
i++;
//读下个单词
sym=getsym(fin);
expression(fin);
if(sym==rparen)
{
j++;
sym=getsym(fin);
}
else errorby(21,fin,lineno);
}
else errorby(21,fin,lineno);
}
else
{
gen(lit,0,num);
sym=getsym(fin);
}
}
else
{
////////////////////////////////////////
p=position(id);
if(p==-1)
errorby(10,fin,lineno);
else
{
switch (table[p].kind)
{
case constant:{gen(lit,0,table[p].val);break;}
case variable:{gen(lod,Lev-table[p].level,table[p].adr);break;}
case procedur:errorby(20,fin,lineno);
}
}
///////////////////////////////////////
sym=getsym(fin);
}
}
void condition(FILE *fin)//条件语句的实现
{
int cx1;//................................
beginfunc("条件语句开始");
if(sym==ifsym)
{
sym=getsym(fin);
tiaojian(fin);
if(sym!=thensym)
{
errorby(15,fin,lineno);
}//出错处理
else
{
sym=getsym(fin);
cx1=cx;//..............................
gen(jpc,0,0);//.............................
k=k+m;
sentence(fin);
code[cx1].a=cx;//.....................................
}
}
else
{
errorby(6,fin,lineno);
}
endfunc("条件语句结束");
}
void callsymh(FILE *fin)//<写语句>的实现
{
int p;
beginfunc("过程调用语句");
if(sym!=callsym)
{
errorby(6,fin,lineno);
}
else
{
sym=getsym(fin);
if(sym!=ident)
{
errorby(7,fin,lineno);
}
else
{
//////////////////////////////////////
p=position(id);
if(p==-1)
errorby(10,fin,lineno);
else
{
if(table[p].kind==procedur)
gen(cal,Lev-table[p].level,code[table[p].adr].a);
else
errorby(14,fin,lineno);
}
/////////////////////////////////////////
sym=getsym(fin);
}
}
endfunc("过程调用结束");
}
void whilesymh(FILE *fin)//<当型循环语句>的实现
{
int cx1,cx2;
beginfunc("当循环语句");
if(sym==whilesym)
{
cx1=cx;
sym=getsym(fin);
tiaojian(fin);
cx2=cx;
gen(jpc,0,0);
if(sym!=dosym)
{
errorby(17,fin,lineno);
}
else
{
sym=getsym(fin);
k=k+m;
sentence(fin);
gen(jmp,0,cx1);
code[cx2].a=cx;
}
}
endfunc("当循环语句结束");
}
void beginsymh(FILE *fin)//<复合语句>的实现
{
beginfunc("复合语句");
if(sym==beginsym)
{
sym=getsym(fin);
sentence(fin);
while(sym==semicolon)
{
sym=getsym(fin);
sentence(fin);
}
if(sym!=endsym)
{
errorby(16,fin,lineno);
}
else
{
sym=getsym(fin);
}
}
endfunc("复合语句结束");
}
void readsymh(FILE *fin)//<读语句>的实现
{
int p;
beginfunc("读语句");
if(sym==readsym)
{
sym=getsym(fin);
if(sym!=lparen)
{
errorby(7,fin,lineno);
}
else
{
sym=getsym(fin);
if(sym==ident)
{
//...........................
p=position(id);
if(p==-1)
errorby(10,fin,lineno);
else
{
gen(opr,0,16);
gen(sto,Lev-table[p].level,table[p].adr);
}
//........................
sym=getsym(fin);
while(sym==comma)
{
sym=getsym(fin);
if(sym!=ident)
{
errorby(7,fin,lineno);
}
else
{//...........................................
p=position(id);
if(p==-1)
errorby(10,fin,lineno);
else
{
gen(opr,0,16);
gen(sto,Lev-table[p].level,table[p].adr);
}//.........................................
sym=getsym(fin);
}
}
if(sym!=rparen)
{
errorby(21,fin,lineno);
}
else
{
sym=getsym(fin);
}
}
}
}
endfunc("读语句结束");
}
void writesymh(FILE *fin)//<写语句>的实现
{
beginfunc("写语句");
if(sym==writesym)
{
sym=getsym(fin);
if(sym!=lparen)
{
errorby(7,fin,lineno);
}
else
{
sym=getsym(fin);
expression(fin);
gen(opr,0,14);//....................................
while(sym==comma)
{
sym=getsym(fin);
expression(fin);
gen(opr,0,14);//.....................................
}
if(sym!=rparen)
{
errorby(21,fin,lineno);
}
else
{
sym=getsym(fin);
}
}
gen(opr,0,15);//......................................
}
endfunc("写语句结束");
}
int base(int l)
{
int b1;
b1=b;
while (l>0)
{
b1=s[b1];
l=l-1;
}
return b1;
}
void interpret()
{
printf("pl0程序开始:\n");
t=0;b=1;p=0;
s[1]=0;s[2]=0;s[3]=0;
do
{
i1=code[p];
p=p+1;
switch(i1.f)
{
case lit:{t=t+1;s[t]=i1.a;break;}
case opr:{
switch(i1.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=t-1;s[t]=s[t]+s[t+1];break;}
case 3:{t=t-1;s[t]=s[t]-s[t+1];break;}
case 4:{t=t-1;s[t]=s[t]*s[t+1];break;}
case 5:{t=t-1;s[t]=s[t]/s[t+1];break;}
case 6:{s[t]=s[t]%2;break;}
case 8:{t=t-1;s[t]=(s[t]==s[t+1]);break;}
case 9:{t=t-1;s[t]=(s[t]!=s[t+1]);break;}
case 10:{t=t-1;s[t]=(s[t]<s[t+1]);break;}
case 11:{t=t-1;s[t]=(s[t]>=s[t+1]);break;}
case 12:{t=t-1;s[t]=(s[t]>s[t+1]);break;}
case 13:{t=t-1;s[t]=(s[t]<=s[t+1]);break;}
case 14:{printf("%d",s[t]);break;}
case 15:{printf("\n");break;}
case 16:{printf(" ? ");t=t+1;scanf("%d",(&s[t]));break;}
}
break;
}
case lod:{
t=t+1;
s[t]=s[base(i1.l)+i1.a];
break;
}
case sto:{
s[base(i1.l)+i1.a]=s[t];
t=t-1;
break;
}
case cal:{
s[t+1]=base(i1.l);
s[t+2]=b;
s[t+3]=p;
b=t+1;
p=i1.a;
break;
}
case inte:{t=t+i1.a;break;}
case jmp:{p=i1.a;break;}
case jpc:{
if(s[t]==0)
p=i1.a;
t=t-1;
break;
}
}
}while(p!=0);
}
void printfct(fct fct1)
{
switch(fct1)
{
case lit:{printf("%10s","lit");break;}
case opr:{printf("%10s","opr");break;}
case lod:{printf("%10s","lod");break;}
case sto:{printf("%10s","sto");break;}
case cal:{printf("%10s","cal");break;}
case inte:{printf("%10s","inte");break;}
case jmp:{printf("%10s","jmp");break;}
case jpc:{printf("%10s","jpc");break;}
}
}
void main()
{
int p=system( "lexyy.exe" );
FILE *fin=fopen("outputfile.txt","r");
sym=getsym(fin);
strcpy(table[ptx].name,"main");
enter(procedur,&ptx,0,&pdx);
program(fin);
if(i!=j)errorby(21,fin,lineno);
if(flag==1)printf("this is right\n");
else printf("this is wrong\n");
printf("总共有错误%5d个\n",errortotal);
for(int i=0;i<errortotal;i++)
printf("%s\n",error[i]);
for(i=0;i<ptx;i++)
{
if(table[i].kind==constant)
printf("%10s%5s%5d%5d\n","constant",table[i].name,table[i].level,table[i].val);
if(table[i].kind==variable)
printf("%10s%5s%5d%5d\n","variable",table[i].name,table[i].level,table[i].adr);
if(table[i].kind==procedur)
printf("%10s%5s%5d%5d\n","procedur",table[i].name,table[i].level,table[i].size);
}
for(i=0;i<cx;i++)
{
printfct(code[i].f);
printf("%5d%5d\n",code[i].l,code[i].a);
}
if(errortotal==0)
interpret();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -