資源簡介
帶說明文檔的編譯原理課程設計,PL0語言可看成是Pascal [1] 語言的子集,它的編譯程序是一個編譯解釋執行系統。

代碼片段和文件信息
#include
#include
#include“PL0.h“
#include
//運行時的數據棧大小,在interpret函數中出現
#define?stacksize?500
/*********************************************************************************
**??在看源程序之前,請始終記住??????????????????????????????**
**??sym表示的是當前字符串的類型,???????????????????????????**
**??num表示的數字,?????????????????????????????????????????**
**??id中存放的是字符串,????????????????????????????????????**
**??記住這點在看源程序的時候非常重要。??????????????????????**
**??另外,還要記住的是nxtlev數組中存放的是后繼符號集????????**
**********************************************************************************/
int?main()
{
bool?nxtlev[symnum];//這個數組表示的是當前語句的后繼符號集合,一共有32個
printf(“Input?pl/0?file?“);//輸入文件的路徑
scanf(“%s“?fname);
fin?=?fopen(fname?“r“);//以只讀打開文件,fin文件指針
if?(fin)
{
printf(“List?object?code??(Y/N)“);
scanf(“%s“?fname);
listswitch?=?(fname[0]?==?‘y‘?||?fname[0]?==?‘Y‘);//listswitch用于列舉代碼
printf(“List?symbol?table??(Y/N)“);
scanf(“%s“?fname);
tableswitch?=?(fname[0]?==?‘y‘?||?fname[0]?==?‘Y‘);//tableswitch表示是否輸出table表
???//該表類似于22頁的表
fa1?=?fopen(“fa1.tmp“?“w“);//以可寫方式打開文件,對于本程序其實是新建一個文件,fa1文件中存儲的是源程序
fprintf(fa1?“Input?pl/0?file?“);//將“Input?pl/0?file?“輸入文件中
fprintf(fa1?“%s\n“?fname);//同上
init();?//初始化
err?=?0;
cc?=?cx?=?ll?=?0;
ch?=?‘?‘;
if?(-1?!=?getsym())
{
//如果程序開始是對的,則往下執行
//fa存放的是模擬程序的代碼
//fas存放的是table表中的數據
fa?=?fopen(“fa.tmp“?“w“);//以可寫形式打開
fas?=?fopen(“fas.tmp“?“w“);//同上
addset(nxtlev?declbegsys?statbegsys?symnum);//symnum=32,初始化后繼符號集一共有32個,即nxtlev數組
nxtlev[period]?=?true;//整個程序可以只有一個‘.‘,即程序是空的也可以
//block是編譯程序的主程序,是分程序的分析處理過程,其里面調用了大部分程序
//耐心看
//請記住在block程序開始的時候,只讀取了源程序的一個語句單位
/*調用編譯程序*/
if?(-1?==?block(0?0?nxtlev))?????????
{
//當程序出錯的時候,則關閉以下文件,并退出程序
fclose(fa);//fa輸出虛擬機代碼
fclose(fa1);//輸出源文件及其各行對應的首地址
fclose(fas);//輸出名字表
fclose(fin);
printf(“\n“);
return?0;
}
fclose(fa);
fclose(fa1);
fclose(fas);
//如果在源程序的結尾沒有‘.‘,則報錯
if?(sym?!=?period)
{
error(9);
}
//err=0表示源程序沒有錯誤
if?(err?==?0)
{
fa2?=?fopen(“fa2.tmp“?“w“);//打開fa2文件,依次執行里面的語句,輸出源程序結果
interpret();????????????????//模擬計算機執行源程序
fclose(fa2);
}
else
{
printf(“Errors?in?pl/0?program“);?????//如果源程序有錯的話,會這樣
}
}
fclose(fin);
}
else
{
printf(“Can‘t?open?file!?\n“);
}
printf(“\n“);
system(“pause“);
return?0;
}
/*?初始化*/
void?init()
{
int?i;
/*設置單字符符號*/
for?(i?=?0;?i?<=?255;?i++)
{
ssym[i]?=?nul;//nul為0,將ssym初始化為0
}
//ssym大小為256,可以表示所有的ASCLL碼,enum?symbol枚舉
ssym[‘+‘]?=?plus;
ssym[‘-‘]?=?minus;
ssym[‘*‘]?=?times;
ssym[‘/‘]?=?slash;
ssym[‘(‘]?=?lparen;
ssym[‘)‘]?=?rparen;
ssym[‘=‘]?=?eql;
ssym[‘‘]?=?comma;
ssym[‘.‘]?=?period;
ssym[‘#‘]?=?neq;
ssym[‘;‘]?=?semicolon;
ssym[‘[‘]?=?lbracket;?/*添加左括號?[?*/
ssym[‘]‘]?=?rbracket;?/*添加右括號?]?*/
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????211??2017-07-14?09:46??對PL0語言及其編譯器進行擴充和修改\測試文件\test1.txt
?????文件????????194??2017-07-14?16:48??對PL0語言及其編譯器進行擴充和修改\測試文件\test2.txt
?????文件????????211??2017-07-14?16:50??對PL0語言及其編譯器進行擴充和修改\測試文件\test3.txt
?????文件??????40496??2017-07-14?09:42??對PL0語言及其編譯器進行擴充和修改\源程序\pl0.cpp
?????文件???????6200??2017-07-13?09:23??對PL0語言及其編譯器進行擴充和修改\源程序\pl0.h
?????文件?????141596??2018-05-13?19:33??對PL0語言及其編譯器進行擴充和修改\編譯原理課程設計說明書.docx
?????目錄??????????0??2018-05-13?19:32??對PL0語言及其編譯器進行擴充和修改\測試文件
?????目錄??????????0??2018-05-13?19:32??對PL0語言及其編譯器進行擴充和修改\源程序
?????目錄??????????0??2018-05-13?19:34??對PL0語言及其編譯器進行擴充和修改
-----------?---------??----------?-----??----
???????????????188908????????????????????9
- 上一篇:關于信噪比的計算,高斯白噪聲
- 下一篇:隨機信號分析常建平課后答案
評論
共有 條評論