資源簡介
仿照Pascal語言,對pl0編譯程序(清華大學書后源碼)進行以下簡單擴展——
不等號:
指針: & @
if - else
for
++ -- += -=
數組
程序還有多不足,希望和大家共同學習!!

代碼片段和文件信息
//A.2?????C??????版???本
/*編譯和運行環境:
*1Visual?C++6.0VisualC++.NET?and?Visual?C++.NET?2003
*WinNT?Win?200?WinXP?and??Win2003?
*2?gcc?version?3.3.2??20031022(Red?Hat?Linux?3.3.2-1)
*Redhat?Fedora?core?1
*Intel?32?platform
*使用方法:
*運行后輸入PL/0?源程序文件名
*回答是否輸出虛擬機代碼
*回答是否輸出名字表
*fa.tmp?cc
*fa1.tmp??輸出源文件及其各行對應的首地址
*fa2.tmp??輸出結果?
*fas.tmp??輸出名字表
*/
#include
#include“pl0.h“
#include“string.h“
/*解釋執行時使用的棧*/
int?main()
{
bool?nxtlev[symnum];
printf(“Input?pl/0?file??“);
scanf(“%s“fname);?????????????????????????????????????/*輸入文件名*/
fin=fopen(fname“r“);
if(fin)?????????????????????????????????????????//fin是當前打開的待測試程序
{
printf(“List?object?code??(Y/N)“);????????????????/*是否輸出虛擬機代碼*/
scanf(“%s“fname);
listswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
printf(“List?symbol?table???(Y/N)“);?????????????/*是否輸出名字表*/
scanf(“%s“fname);
tableswitch=(fname[0]==‘y‘||fname[0]==‘Y‘);
fa1=fopen(“fa1.tmp““w“);
fprintf(fa1“Iput?pl/0?file??“);
fprintf(fa1“%s\n“?fname);
init();??????????????????????????????????????????/*初始化*/
err=0;
cc=cx=ll=0;??????????????????????????//cc是getchar使用的計數器,表示當前字符ch的位置;cx:虛擬機代碼指針
ch=‘?‘;??????????????????????????????//漏掉空格,讀取一個字符
if(-1!=getsym())
{
fa=fopen(“fa.tmp““w“);?????????????????//輸出虛擬機代碼
fas=fopen(“fas.tmp““w“);????????????????//輸出名字表
addset(nxtlevdeclbegsysstatbegsyssymnum);
nxtlev[period]=true;????????????????????????????????????//period??句號的意思
if(-1==block(00nxtlev)) /*調用編譯程序*/
{
fclose(fa);
fclose(fa1);
fclose(fas);????????????????????????//除了fa2輸出結果沒關
fclose(fin);
printf(“\n“);
return?0;
}
fclose(fa);
fclose(fa1);
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[‘[‘]=lmparen;???????????????????????????????????????????????????????????//新
ssym[‘]‘]=rmparen;???????????????????????????????????????????????????????????//新
ssym[‘=‘]=eql;
ssym[‘‘]=comma;
ssym[‘.‘]=period;
ssym[‘;‘]=semicolon;
ssym[‘&‘]=radsym;????????????????????????????????????????????????????????????//新
ssym[‘@‘]=padsym;????????????????????????????????????????????????????????????//新
/*設置保留字名字按照字母順序便于折半查找*/
strcpy(&(word[0][0])“begin“);
strcpy(&(word[1][0])“call“);
strcpy(&(word[2][0])“const“);
strcpy(&(word[3][0])“do“);
strcpy(&(word[4][0])“downto“);????????????????????????????????????????????//新
strcpy(&(word[5][0])“else“);????????????????????????????????????????????//新
strcpy(&(word[
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????151??2010-06-09?14:15??鄭博涵070104010056\++--.txt
?????文件????????141??2010-06-19?14:07??鄭博涵070104010056\array_basic.txt
?????文件????????172??2010-06-09?14:45??鄭博涵070104010056\array_mul.txt
?????文件?????213043??2010-07-03?10:21??鄭博涵070104010056\Debug\PL0.exe
?????文件?????210996??2010-07-03?10:21??鄭博涵070104010056\Debug\PL0.ilk
?????文件??????65307??2010-07-03?10:21??鄭博涵070104010056\Debug\PL0.obj
?????文件?????224512??2010-07-03?10:21??鄭博涵070104010056\Debug\PL0.pch
?????文件?????410624??2010-07-03?10:21??鄭博涵070104010056\Debug\PL0.pdb
?????文件??????33792??2010-07-03?10:28??鄭博涵070104010056\Debug\vc60.idb
?????文件??????53248??2010-07-03?10:21??鄭博涵070104010056\Debug\vc60.pdb
?????文件?????????84??2007-01-04?11:46??鄭博涵070104010056\else_and_notequal.txt
?????文件????????106??2010-06-19?23:02??鄭博涵070104010056\expand_=.txt
?????文件??????????0??2010-07-03?10:29??鄭博涵070104010056\fa.tmp
?????文件????????157??2010-07-03?10:29??鄭博涵070104010056\fa1.tmp
?????文件?????????30??2010-07-03?10:29??鄭博涵070104010056\fa2.tmp
?????文件??????????0??2010-07-03?10:29??鄭博涵070104010056\fas.tmp
?????文件????????107??2010-06-09?00:02??鄭博涵070104010056\for_array.txt
?????文件????????267??2006-12-11?11:23??鄭博涵070104010056\lxm.PL0
?????文件??????53002??2010-07-03?10:19??鄭博涵070104010056\PL0.cpp
?????文件???????3365??2006-12-14?01:56??鄭博涵070104010056\PL0.dsp
?????文件????????529??2006-12-11?11:30??鄭博涵070104010056\PL0.dsw
?????文件???????5354??2010-06-19?17:13??鄭博涵070104010056\pl0.h
?????文件??????91136??2010-07-03?10:30??鄭博涵070104010056\PL0.ncb
?????文件??????48640??2010-07-03?10:30??鄭博涵070104010056\PL0.opt
?????文件???????1098??2010-07-03?10:21??鄭博涵070104010056\PL0.plg
?????文件????????562??2006-12-11?10:52??鄭博涵070104010056\PL0.sln
?????文件???????3938??2006-12-11?09:15??鄭博涵070104010056\PL0.vcproj
?????文件?????????62??2010-06-10?16:38??鄭博涵070104010056\point_basic.txt
?????文件?????131072??2006-12-11?09:13??鄭博涵070104010056\Project1.tds
?????文件????????475??2010-06-19?23:03??鄭博涵070104010056\測試程序說明.txt
............此處省略5個文件信息
評論
共有 條評論