编译原理(PL0编译程序源代码)
- 格式:docx
- 大小:12.85 KB
- 文档页数:19
/*PL/0编译程序(C语言版)
*编译和运行环境:
*Visual C++
*WinXP/7
*利用方式:
*运行后输入PL/0源程序文件名
*回答是不是将虚拟机代码写入文件
*回答是不是将符号表写入文件
*执行成功会产生四个文件 (词法分析结果.txt符号表.txt虚拟代码.txt源程序和地址.txt)
*/
#include <>
#include""
#include"string"
#define stacksize 500xt","w");
fa1=fopen("源程序和地址.txt","w");xt","w");
fas=fopen("符号表.txt","w");
addset(nxtlev,declbegsys,statbegsys,symnum);
nxtlev[period]=true;
if(-1==block(0,0,nxtlev)){n\n");
fprintf(cifa,"源程序显现错误,请检查!!!");
fprintf(fa1,"源程序显现错误,请检查!!!");
fprintf(fa,"源程序显现错误,请检查!!!");
fprintf(fas,"源程序显现错误,请检查!!!");
}fclose(fa);
fclose(fa1);
fclose(fas);
}fclose(fin);
}else{
printf("Can't open file!\n");
}
fclose(cifa);]=period; ssym['#']=neq;
ssym[';']=semicolon;
strcpy(&(word[0][0]),"begin");\n\n" );
fprintf(fa1,"\t\t程序结尾丢了句号“.”\n");
break;
case 10:
printf("\t\t语句之间漏了“;”\n" );
fprintf(fa1,"\t\t语句之间漏了“;”\n");
break;
case 11:
printf("\t\t标识符拼写错误或未说明\n" );
fprintf(fa1,"\t\t标识符拼写错误或未说明\n");
break;
case 12:
printf("\t\t赋值语句中,赋值号左部标识符属性应是变量\n" );
fprintf(fa1,"\t\t赋值语句中,赋值号左部标识符属性应是变量\n");
break;
case 13:
printf("\t\t赋值语句左部标识符后应是复制号“:=”\n" );
fprintf(fa1,"\t\t赋值语句左部标识符后应是复制号“:=”\n");
break;
case 14:
printf("\t\tcall后应为标识符\n" );
fprintf(fa1,"\t\tcall后应为标识符\n");
break;
case 15:
printf("\t\tcall后标识符属性应为进程\n" );
fprintf(fa1,"\t\tcall后标识符属性应为进程\n");
break;
case 16:
printf("\t\t条件语句中丢了then\n" ); fprintf(fa1,"\t\t条件语句中丢了then\n");
break;
case 17:
printf("\t\t丢了“end”或“;”\n" );
fprintf(fa1,"\t\t丢了“end”或“;”\n");
break;
case 18:
printf("\t\twhile型循环语句中丢了“do”\n" );
fprintf(fa1,"\t\twhile型循环语句中丢了“do”\n");
break;
case 19:
printf("\t\t语句后的符号不正确\n" );
fprintf(fa1,"\t\t语句后的符号不正确\n" );
break;
case 20:
printf("\t\t应为关系运算符\n" );
fprintf(fa1,"\t\t应为关系运算符\n");
break;
case 21:
printf("\t\t表达式内标示符属性不能是进程\n" );
fprintf(fa1,"\t\t表达式内标示符属性不能是进程\n");
break;
case 22:
printf("\t\t表达式漏掉了右括号\n" );
fprintf(fa1,"\t\t表达式漏掉了右括号\n");
break;
case 23:
printf("\t\t因子后的非法符号\n" );
fprintf(fa1,"\t\t因子后的非法符号\n");
break;
case 24: printf("\t\t表达式的开始符不能是此符号\n" );
fprintf(fa1,"\t\t表达式的开始符不能是此符号\n");
break;
case 25:
printf("\t\t标识符越界\n" );
fprintf(fa1,"\t\t标识符越界\n");
break;
case 26:
printf("\t\t非法字符\n" );
fprintf(fa1,"\t\t非法字符\n");
break;
case 31:
printf("\t\t数越界\n");
fprintf(fa1,"\t\t数越界\n");
break;
case 32:
printf("\t\tread语句括号中的标识符不是变量\n" );
fprintf(fa1,"\t\tread语句括号中的标识符不是变量\n");
break;
case 33:
printf("\t\twrite()或read()中应为完整表达式\n" );
fprintf(fa1,"\t\twrite()或read()中应为完整表达式\n");
break;
default:
printf("\t\t显现未知错误\n" );
fprintf(fa1,"\t\t显现未知错误\n");
}err++;
}
:break;
default :error(26);
} if(sym!=period){t\tperiod\n");
}
}
}
}
}
}return 0;
}
=x;
code[cx].l=y;
code[cx].a=z;
cx++;
return 0;
}
dr=cx;
gendo(jmp,0,0);
if(lev>levmax){dr].a=cx;dr=cx;ize=dx;
cx0=cx;
gendo(inte,0,dx);ind){
case constant:
fprintf(fas,"%d const %s ",i,table[i].name);
fprintf(fas,"val=%d\n",table[i].val);
break;
case variable:
fprintf(fas,"%d var %s ",i,table[i].name);
fprintf(fas,"lev=%daddr=%d\n",table[i].level,table[i].adr);
break;
case procedur:
fprintf(fas,"%d proc %s ",i,table[i].name); fprintf(fas,"lev=%daddr=%dsize=%d\n",
table[i].level,table[i].adr,table[i].size);
break;
}
}
}
memcpy(nxtlev,fsys,sizeof(bool)*symnum);ame,id);
table[(* ptx)].kind=k;
switch(k){
case constant:
if(num>amax){
error(31);
num=0;
}
table[(*ptx)].val=num;
break;
case variable:
table[(*ptx)].level=lev;
table[(*ptx)].adr=(*pdx);
(*pdx)++;
break;
case procedur:
table[(*ptx)].level=lev;
break;
}
}
ame,idt);
i=tx;ame,idt)!=0){
i--;
}return i;
}