資源簡介
編譯原理(張素琴版)的PL/0編譯程序的C語言代碼,在目錄中附有測試文本文件test.txt,該程序可用于編譯原理的學(xué)習(xí)

代碼片段和文件信息
/*
*錄入:codecjw
*本程序有兩文件:pl.c和pl.h
*pl/0語法請參考清大編譯原理(張素琴版),壓縮包中test.txt文件符合pl/0語法
*使用方法:
*運行后輸入pl/0源程序文件名
*回答是否輸出虛擬機代碼
*回答是否輸出名字表
*fa.tmp輸出虛擬機代碼
*fa1.tmp輸出源文件及其各行對應(yīng)的首地址
*fa2.tmp輸出結(jié)果
*fas.tmp輸出名字表
*特別說明:虛擬機代碼的inte與int同效
*/
#include
#include“pl.h“
#include
#define?stacksize?500
int?main()
{
bool?nxtlev[symnum];
printf(“input?pl/0?file?“);
scanf(“%s“fname);
fin=fopen(fname“r“);
if(fin)
{
printf(“l(fā)ist?object?code?(Y/N)“);
scanf(“%s“fname);
listswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
printf(“l(fā)ist?symbol?table?(Y/N)“);
scanf(“%s“fname);
tableswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
fal=fopen(“fal.tmp““w“);
fprintf(fal“input?pl/0?file?“);
fprintf(fal“%s\n“fname);
init();
err=0;
cc=cx=ll=0;
ch=‘?‘;
if(-1!=getsym())
{
fa=fopen(“fa.tmp““w“);
fas=fopen(“fas.tmp““w“);
addset(nxtlevdeclbegsysstatbegsyssymnum);
nxtlev[period]=true;
if(-1==block(00nxtlev))
{
fclose(fa);
fclose(fal);
fclose(fas);
fclose(fin);
printf(“\n“);
return?0;
}
fclose(fa);
fclose(fal);
fclose(fas);
if(sym!=period)
{
error(9);
}
if(err==0)
{
fa2=fopen(“fa2.tmp““w“);
interpret();
fclose(fa2);
}
else
{
printf(“errors?in?pl/0?program“);
}
fclose(fin);
}
else
{
printf(“can‘t?open?file!\n“);
}
printf(“\n“);
return?0;
}
}
void?init()
{
int?i;
for(i=0;i<255;i++)
{
ssym[i]=nul;
}
ssym[‘+‘]=plus;
ssym[‘-‘]=minus;
ssym[‘*‘]=times;
ssym[‘/‘]=slash;
ssym[‘(‘]=lparen;
ssym[‘)‘]=rparen;
ssym[‘=‘]=eql;
ssym[‘‘]=comma;
ssym[‘.‘]=period;
ssym[‘#‘]=neq;
ssym[‘;‘]=semicolon;
strcpy(&(word[0][0])“begin“);
strcpy(&(word[1][0])“call“);
strcpy(&(word[2][0])“const“);
strcpy(&(word[3][0])“do“);
strcpy(&(word[4][0])“end“);
strcpy(&(word[5][0])“if“);
strcpy(&(word[6][0])“odd“);
strcpy(&(word[7][0])“procedure“);
strcpy(&(word[8][0])“read“);
strcpy(&(word[9][0])“then“);
strcpy(&(word[10][0])“var“);
strcpy(&(word[11][0])“while“);
strcpy(&(word[12][0])“write“);
wsym[0]=beginsym;
wsym[1]=callsym;
wsym[2]=constsym;
wsym[3]=dosym;
wsym[4]=endsym;
wsym[5]=ifsym;
wsym[6]=oddsym;
wsym[7]=procsym;
wsym[8]=readsym;
wsym[9]=thensym;
wsym[10]=varsym;
wsym[11]=whilesym;
wsym[12]=writesym;
strcpy(&(mnemonic[lit][0])“l(fā)it“);
strcpy(&(mnemonic[opr][0])“opr“);
strcpy(&(mnemonic[lod][0])“l(fā)od“);
strcpy(&(mnemonic[sto][0])“sto“);
strcpy(&(mnemonic[cal][0])“cal“);
strcpy(&(mnemonic[inte][0])“inte“);
strcpy(&(mnemonic[jmp][0])“jmp“);
strcpy(&(mnemonic[jpc][0])“jpc“);
for(i=0;i {
declbegsys[i]=false;
statbegsys[i]=false;
facbegsys[i]=false;
}
declbegsys[constsym]=true;
declbegsys[varsym]=true;
declbegsys[procsym]=true;
statbegsys[beginsym]=true;
statbegsys[callsym]=true;
statbegsys[ifsym]=true;
statbeg
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄??????????0??2009-03-23?00:10??pl
?????文件??????19618??2008-06-03?16:47??pl\pl.c
?????文件???????4291??2008-03-25?16:59??pl\pl.dsp
?????文件????????529??2008-03-25?15:31??pl\pl.dsw
?????文件???????3642??2008-03-25?16:28??pl\pl.h
?????文件??????50176??2009-03-23?00:09??pl\pl.ncb
?????文件??????57856??2009-03-23?00:09??pl\pl.opt
?????文件???????1333??2009-03-23?00:09??pl\pl.plg
?????文件?????????59??2008-06-01?15:01??pl\test.txt
-----------?---------??----------?-----??----
???????????????137504????????????????????9
評論
共有 條評論