编译原理(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;

}