版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p> 課程名稱__編譯原理_ _______</p><p> 題目名稱__對(duì)PL0進(jìn)行擴(kuò)充和修改</p><p> 學(xué)生學(xué)院__計(jì)算機(jī)學(xué)院 ________</p><p> 專業(yè)班級(jí)__計(jì)算機(jī)科學(xué)與技術(shù)___</p><
2、;p> 學(xué) 號(hào) 3106006475 </p><p> 學(xué)生姓名___楊振風(fēng) __ _______</p><p> 指導(dǎo)教師__ 吳偉民____________</p><p> 2009 年 1 月 7 日</p><p><b> 課程設(shè)計(jì)概述</b><
3、;/p><p> PL0語(yǔ)言是Pascal語(yǔ)言的一個(gè)子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng),PL0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語(yǔ)言,與具體的計(jì)算機(jī)無(wú)關(guān)。編譯程序采用一趟掃描方式,已語(yǔ)法語(yǔ)義分析程序?yàn)楹诵?,詞法分析程序和代碼生成的程序都作為一個(gè)獨(dú)立的過(guò)程,當(dāng)語(yǔ)法分析需要讀單詞的時(shí)候就調(diào)用詞法分析程序,而當(dāng)語(yǔ)法分析正確需要生成相應(yīng)的目標(biāo)代碼時(shí)候 ,就調(diào)用代碼生成程序。此外用表格管理程序建立變量,常量和過(guò)程標(biāo)識(shí)符的
4、說(shuō)明與引用之間的信息聯(lián)系,用出錯(cuò)處理程序?qū)υ~法和語(yǔ)義分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和錯(cuò)誤性質(zhì)。</p><p> 本課程設(shè)計(jì)通過(guò)對(duì)PL/0(C語(yǔ)言版)進(jìn)行修改和添加功能完成設(shè)計(jì),通過(guò)修改詞法分析程序、語(yǔ)法分析、程序編譯主體block和解釋執(zhí)行等各部分的修改擴(kuò)充,完成基本內(nèi)容和選做內(nèi)容。擴(kuò)充了賦值運(yùn)算+=、-=,運(yùn)算++、--,以及擴(kuò)充語(yǔ)句 repeat<語(yǔ)句序列>dowhile<條件&
5、gt;。</p><p><b> 操作平臺(tái)</b></p><p> 操作系統(tǒng)Windows XP SP3,硬件:AMD athlon 3600+ 1.9GHZ,1G內(nèi)存</p><p> 軟件:Visual C++6.0創(chuàng)天中文版</p><p><b> 主要成分的描述</b><
6、/p><p><b> 符號(hào)表</b></p><p> 根據(jù)符號(hào)變量的存儲(chǔ)類別定義及他們除向的位置和次序來(lái)確定每一個(gè)變量應(yīng)分配的存儲(chǔ)區(qū)及在該區(qū)的具體位置。編譯程序有兩類的存儲(chǔ)區(qū),即靜態(tài)的存儲(chǔ)區(qū)和動(dòng)態(tài)的存儲(chǔ)區(qū)。由于本課程設(shè)計(jì)沒(méi)有添加其他的數(shù)據(jù)類型暫時(shí)不需要在符號(hào)表里面處理。</p><p> 運(yùn)行時(shí)存儲(chǔ)組織和管理</p><
7、;p> 采用棧式存儲(chǔ)分配,運(yùn)行時(shí)每進(jìn)入一個(gè)過(guò)程,就在棧頂為該過(guò)程分配所需的數(shù)據(jù)空間,當(dāng)一個(gè)過(guò)程工作完畢返回時(shí),它在棧頂?shù)臄?shù)據(jù)空間也即釋放程序運(yùn)行時(shí)的存儲(chǔ)空間,棧中在某一個(gè)時(shí)刻可能會(huì)包含某個(gè)過(guò)程的幾個(gè)活動(dòng)記錄,即某個(gè)過(guò)程遞歸調(diào)用的情況,另外同樣一個(gè)存儲(chǔ)的位置,可能會(huì)不同運(yùn)行時(shí)刻分配給不同的數(shù)據(jù)對(duì)象。</p><p><b> 詞法分析的過(guò)程</b></p><p&
8、gt; PL0的詞法分析程序GETSYM是一個(gè)獨(dú)立的過(guò)程,其功能是為語(yǔ)法語(yǔ)義分析提供單詞,把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號(hào)傳遞給語(yǔ)法語(yǔ)義分析為此PL0設(shè)置了3個(gè)全程變量</p><p> SYM 存放每個(gè)單詞的類別,用內(nèi)部編碼表示</p><p> ID 存放用戶所定義的標(biāo)識(shí)符的值。</p><p> NUM 存放用戶定義的數(shù)</p>
9、;<p><b> 語(yǔ)法分析方法</b></p><p> 在PL/0中是采用遞歸子程序法進(jìn)行語(yǔ)法分析的,具體實(shí)現(xiàn)方法是為每個(gè)非終結(jié)符寫一個(gè)函數(shù),如遇到變量聲明時(shí)調(diào)用變量聲明函數(shù),遇到常量聲明時(shí)調(diào)用常量聲明函數(shù)等。</p><p><b> 中間代碼表示</b></p><p> 編譯程序所使用的中間
10、代碼有多種形式。常見(jiàn)的有逆波蘭式,三元式,四元式和樹(shù)形表示。</p><p><b> 目標(biāo)代碼</b></p><p> PL0編譯程序所產(chǎn)生的目標(biāo)代碼是一個(gè)假想的棧式計(jì)算機(jī)匯編語(yǔ)言,可稱為類PCODE指令代碼,它不依賴于任何的實(shí)際計(jì)算機(jī)指令的格式如下:</p><p> 其中f代表功能碼,l代表層次差,也就是引用變量或過(guò)程的分程序與說(shuō)
11、明該變量或過(guò)程的分程序之間的層次差。a的含義對(duì)不同的指令有所區(qū)別。這里我們需要用到的有關(guān)目標(biāo)指令有:LIT LOD STO CAL INT JMP JPC OPR</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 擴(kuò)充賦值運(yùn)算</b></p><p> ?、偈紫仍陬^文件的enum sy
12、mbol中添加自己定義的+=,-=運(yùn)算的關(guān)鍵字peq和meq。還有#defiine symnum以便詞法分析時(shí)能夠正確的識(shí)別這些關(guān)鍵字。</p><p> ②在詞法分析程序中添加對(duì)+=和-=的識(shí)別,也就是在程序中找到getsym函數(shù),添加如下:</p><p> else if(ch=='+')</p><p><b> {</
13、b></p><p><b> getchdo;</b></p><p> if(ch=='=')</p><p><b> { </b></p><p> sym=peq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> g
14、etchdo;</b></p><p><b> }</b></p><p> else if(ch=='+')</p><p><b> {</b></p><p><b> sym=ppl;</b></p><p>
15、;<b> getchdo;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sym=plus;</b></p&
16、gt;<p><b> }</b></p><p><b> }</b></p><p> 同理對(duì)于-=的標(biāo)識(shí)符:</p><p> else if(ch=='-')</p><p><b> {</b></p><p
17、><b> getchdo;</b></p><p> if(ch=='=')</p><p><b> { </b></p><p> sym=meq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> getchdo;</b></
18、p><p><b> }</b></p><p> else if(ch=='-')</p><p><b> {</b></p><p><b> sym=mmi;</b></p><p><b> getchdo;&l
19、t;/b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> sym=minus;</p><p><b> }</b><
20、/p><p><b> }</b></p><p> ③接著在語(yǔ)句處理函數(shù)statement添加如下的代碼:</p><p> if(sym==becomes||sym==peq||sym==meq)</p><p><b> {</b></p><p> peqop=
21、sym;這是自己定義的標(biāo)識(shí)符,識(shí)別運(yùn)算符</p><p><b> getsymdo;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p
22、> error(13);</p><p><b> }</b></p><p> memcpy(nxtlev,fsys,sizeof(bool)* symnum);</p><p> expressiondo(nxtlev,ptx,lev);</p><p> if(i!=0&&peqop
23、==becomes)//賦值</p><p><b> {</b></p><p> gendo(sto,lev-table[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b> }</b></p><p> if(i!=0&&p
24、eqop==peq)//+=運(yùn)算</p><p><b> {</b></p><p> gendo(lod,lev-table[i].level,table[i].adr);//將變量放到棧頂</p><p> gendo(opr,0,2); //加法運(yùn)算</p>&
25、lt;p> endo(sto,lev-table[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b> }</b></p><p> if(i!=0&&peqop==meq)//-=運(yùn)算</p><p><b> {</b></p>
26、<p> gendo(lod,lev-table[i].level,table[i].adr);//將變量放到棧頂</p><p> gendo(opr,0,3);</p><p> gendo(opr,0,1); //減法運(yùn)算</p><p> gendo(sto,lev-tabl
27、e[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b> }</b></p><p> 2、擴(kuò)充語(yǔ)句repeat dowhile</p><p> ?、偈紫仍陬^文件中的enum symbol中添加repeatsym 和dowhilesym之后同樣在#define symnum名字表的類型數(shù)相應(yīng)的
28、增加,還有在#define norw變化相應(yīng)的數(shù)字。以便在詞法分析時(shí)能夠識(shí)別。</p><p> ②來(lái)到初始化函數(shù)void init()中新增設(shè)置保留字,按照字母順序,便于折半查找:</p><p> strcpy(&(word[4][0]),"dowhile");</p><p> strcpy(&(word[4][0])
29、,"repeat");</p><p> 接下來(lái)在設(shè)置保留字符號(hào):</p><p> wsym[4]=dowhilesym;</p><p> wsym[4]=repeatsym;</p><p> ③接下來(lái)到語(yǔ)句處理函數(shù)statement中添加如下的代碼:</p><p><b>
30、; else</b></p><p><b> {</b></p><p> if(sym==repeatsym)/*準(zhǔn)備按照repeat語(yǔ)句處理*/</p><p><b> {</b></p><p> cx1=cx; /*保存判斷條件超作的位置*/</
31、p><p><b> getsymdo;</b></p><p> memcpy(nxtlev,fsys,sizeof(bool)*symnum);</p><p> nxtlev[dowhilesym]=true;/*后跟符號(hào)為do*/</p><p> statementdo(fsys,ptx,lev); /*循
32、環(huán)體*/</p><p> /cx2=cx; /*保存循環(huán)體的結(jié)束的下一個(gè)位置*/</p><p> //gendo(jmp,0,cx1);/*回頭重新判斷條件*/</p><p> if(sym==dowhilesym)</p><p><b> {</b></p><p>
33、<b> getsymdo;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> error(34); /*缺少dowhile*/</p
34、><p><b> }</b></p><p> conditiondo(nxtlev,ptx,lev); /*調(diào)用條件處理*/</p><p> cx2=cx; /*保存循環(huán)體的結(jié)束的下一個(gè)位置*/</p><p> gendo(jpc,0,0);/*生成條件跳轉(zhuǎn),但跳出循環(huán)的地址未知*/</p
35、><p> gendo(jmp,0,cx1);/*回頭重新判斷條件*/</p><p> code[cx2].a=cx; /*反填跳出循環(huán)的地址,與if類似*/</p><p><b> }</b></p><p> 3、增加運(yùn)算++和--</p><p> ?、偈紫葋?lái)到頭文件中找到enu
36、m symbol添加自己定義的++,--運(yùn)算符關(guān)鍵字ppl和mmi。有#defiine symnum以便詞法分析時(shí)能夠正確的識(shí)別這些關(guān)鍵字。</p><p> ?、谶@里跟前面不一樣的地方就是還要添加:</p><p> facbegsys[ppl]=true;</p><p> facbegsys[mmi]=true;</p><p>
37、 這是一個(gè)關(guān)鍵的地方,因?yàn)槿绻?+或—當(dāng)作表達(dá)式的開(kāi)始符號(hào)時(shí)候,首先能夠正常的標(biāo)識(shí)符一樣。</p><p> ?、墼谠~法分析程序中添加對(duì)+=和-=的識(shí)別,也就是在程序中找到getsym函數(shù),添加如下:</p><p> else if(ch=='+')</p><p><b> {</b></p><p
38、><b> getchdo;</b></p><p> if(ch=='=')</p><p><b> { </b></p><p> sym=peq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> getchdo;</b></
39、p><p><b> }</b></p><p> else if(ch=='+')</p><p><b> {</b></p><p> sym=ppl; 這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> getchdo;</
40、b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sym=plus;</b></p><p><b>
41、}</b></p><p><b> }</b></p><p> 同理對(duì)于-=的標(biāo)識(shí)符:</p><p> else if(ch=='-')</p><p><b> {</b></p><p><b> getchdo;&l
42、t;/b></p><p> if(ch=='=')</p><p><b> { </b></p><p> sym=meq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> getchdo;</b></p><p><b>
43、 }</b></p><p> else if(ch=='-')</p><p><b> {</b></p><p> sym=mmi; 這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b> getchdo;</b></p><p>
44、;<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> sym=minus;</p><p><b> }</b></p><p><b>
45、}</b></p><p> ?、芨鶕?jù)前面語(yǔ)法描述,可以看出我這里是把i++或i—作為語(yǔ)句或因子來(lái)進(jìn)行處理的,這就得在相應(yīng)地方添加語(yǔ)句處理功能。</p><p> 作為語(yǔ)句處理時(shí),在statement中添加代碼如下:</p><p> 情況一:如a++,a—運(yùn)算符在后面:</p><p> if(sym==ident)這里是
46、以變量開(kāi)始</p><p><b> {</b></p><p> i=position(id,*ptx);變量在符號(hào)表的位置</p><p><b> if(i==0)</b></p><p><b> {</b></p><p> erro
47、r(11);出錯(cuò)處理</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(table[i].kind!=variable)只有對(duì)變量才可以做自增自減運(yùn)算</p>&
48、lt;p><b> {</b></p><p> error(12);</p><p><b> i=0;</b></p><p><b> }</b></p><p><b> else</b></p><p>&
49、lt;b> {</b></p><p><b> getsymdo;</b></p><p> if(sym==ppl)++運(yùn)算</p><p><b> { </b></p><p> gendo(lod,lev-table[i].level,table[i].ad
50、r);把變量放入棧頂</p><p> gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p>&l
51、t;b> getsymdo;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(sym==mmi)—運(yùn)算</p><p>&
52、lt;b> { </b></p><p> gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p> gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p>
53、<p> gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p><p><b> }</b></p><p> 情況二:如++a,—a運(yùn)算符在前面:</p><p&
54、gt; if(sym==ppl)</p><p><b> { </b></p><p> i=position(id,*ptx);</p><p><b> if(i==0)</b></p><p><b> {</b></p><p>
55、 error(11);</p><p> }//參考書上面的例子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p><b> else{</b></p><p><b> getsymdo;</b></p><p> gendo(lod,lev-table[i].level,table[i]
56、.adr);把變量放入棧頂</p><p> gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p>
57、;<b> getsymdo;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(sym==mmi)</p><p><b> { </b></p><p>
58、i=position(id,*ptx);</p><p><b> if(i==0)</b></p><p><b> {</b></p><p> error(11);</p><p><b> }//同理,</b></p><p><b
59、> else</b></p><p><b> {</b></p><p><b> getsymdo;</b></p><p> gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p> gendo(lit
60、,0,1); 將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p>
61、<p><b> }</b></p><p><b> }</b></p><p> 作為因子處理時(shí),在factor中添加代碼如下:</p><p> 情況一:如a++,a—運(yùn)算符在后面:</p><p> 作為因子處理時(shí),得在因子處理函數(shù)factor中當(dāng)檢測(cè)到當(dāng)前單詞是標(biāo)識(shí)符
62、時(shí),通過(guò)查找名字表確定類型,然后再通過(guò)switch進(jìn)行選擇操作,在switch中添加代碼如下:</p><p> switch(table[i].kind)</p><p><b> {</b></p><p> case constant: /*名字為常量*/</p><p> gendo(lit,0,tab
63、le[i].val); </p><p> getsymdo; /*直接把常量的值入棧*/</p><p><b> break;</b></p><p> case variable: /*名字為變
64、量*/</p><p> gendo(lod,lev-table[i].level,table[i].adr); /*找到變量地址并將其值入棧*/</p><p><b> getsymdo;</b></p><p> if(sym==ppl)++運(yùn)算</p><p><b> { </
65、b></p><p> gendo(lod,lev-table[i].level,table[i].adr);把變量放入棧頂</p><p> gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto
66、,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {&l
67、t;/b></p><p> if(sym==mmi)—運(yùn)算</p><p><b> { </b></p><p> gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p> gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p
68、><p> gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p><p><b> }&
69、lt;/b></p><p> case procedur: </p><p> getsymdo;/*名字為過(guò)程*/</p><p> error(21); /*不能為過(guò)程*/</p><p><b> break;</b></p><p><b> }</
70、b></p><p> 情況二:如++a,—a運(yùn)算符在前面:</p><p> if(sym==ppl)</p><p><b> {</b></p><p> getsymdo; </p><p> if(sym==ident)</p><p><b
71、> {</b></p><p> i=position(id,*ptx);</p><p><b> if(i==0)</b></p><p><b> {</b></p><p> error(11);</p><p> }//參考書上面的例
72、子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p> else if(table[i].kind==variable) { </p><p> gendo(lod,lev-table[i].level,table[i].adr);把變量放入棧頂</p><p> gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p
73、><p> gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p><p><b> }<
74、;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(sym==mmi)<
75、;/p><p><b> {</b></p><p><b> getsymdo;</b></p><p> if(sym==ident)</p><p><b> {</b></p><p> i=position(id,*ptx);</p
76、><p><b> if(i==0)</b></p><p><b> {</b></p><p> error(11);</p><p> }//參考書上面的例子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p> else if(table[i].kind==vari
77、able) </p><p><b> {</b></p><p> gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p> gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p><p> gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)
78、容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p> gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b> getsymdo;</b></p><p><b> }</b></p><p><b> }
79、</b></p><p><b> }</b></p><p><b> 五、測(cè)試用例</b></p><p> 測(cè)試時(shí),完成一個(gè)功能就先測(cè)試,保證后面的程序不會(huì)因前面的不通過(guò)而影響到后面的。由于把全部的例子寫在一個(gè)PL0文件中,提示程序太長(zhǎng)所以就寫了兩個(gè)例子,這里就只測(cè)試+=,-=賦值運(yùn)算,++,--運(yùn)
80、算以及repeat dowhile語(yǔ)句:</p><p> 六、開(kāi)發(fā)過(guò)程和完成情況</p><p><b> 開(kāi)發(fā)過(guò)程:</b></p><p> 這次編譯原理課程設(shè)計(jì)是在昨晚實(shí)驗(yàn)的基礎(chǔ)上完成的總體來(lái)說(shuō)難度不是很。之前在做實(shí)驗(yàn)時(shí)已對(duì)基本的關(guān)鍵字進(jìn)行了添加,這次課程設(shè)計(jì)主要是對(duì)一些功能進(jìn)行擴(kuò)充和修改。在做+=和-=運(yùn)算時(shí)關(guān)鍵是理解變量在符號(hào)
81、表的位置,以及如何進(jìn)行把變量放到棧頂和把棧頂?shù)膬?nèi)容送入變量單元中。在gendo功能上似乎遇到了問(wèn)題,即3個(gè)參數(shù)的功能碼,層差和位移量。關(guān)鍵在理解后面兩個(gè)參數(shù)lev-table[i].level和table[i].adr.還有 i=position(id,*ptx)中i的功能。需要 說(shuō)明的是在做-=運(yùn)算時(shí)結(jié)果總是為負(fù)數(shù),經(jīng)過(guò)慢慢思考其運(yùn)算的過(guò)程,最終也解決了。其實(shí)在這一步一步的過(guò)程就逐漸理解PL0的過(guò)程。到了repeat dowhile
82、的過(guò)程,參照了原來(lái)程序就帶有的功能。即while do,難度也不是很大!在做++,--運(yùn)算時(shí),開(kāi)始時(shí)候在statement函數(shù)添加了處理語(yǔ)句。對(duì)于a++能編譯通過(guò),而++a就不行,后面在網(wǎng)上參考了例子,原來(lái)還有一種情況就是++當(dāng)作因子處理的情況。前面只是當(dāng)作語(yǔ)句處理。之后就能處理形如b:=++a的語(yǔ)句。解決了這些問(wèn)題后,后面打算添加如for to do的語(yǔ)句,但是在</p><p><b> 完成情況
83、</b></p><p> 完成內(nèi)容:擴(kuò)充賦值運(yùn)算+=,-=和repeat <語(yǔ)句序列>dowhile<條件>,</p><p> 以及自增++自減—運(yùn)算。For <條件>to<條件> do<語(yǔ)句序列>最后因?yàn)槎啻握{(diào)試沒(méi)有通過(guò),也就沒(méi)有完成這一功能。</p><p><b> 七
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--對(duì)pl0進(jìn)行擴(kuò)充和修改
- 編譯原理課程設(shè)計(jì)--對(duì)PL0進(jìn)行擴(kuò)充和修改.doc
- 編譯原理課程設(shè)計(jì)-- pl0語(yǔ)言的擴(kuò)充
- 編譯原理課程設(shè)計(jì)---pl0編輯器擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告--pl0編譯器的擴(kuò)充
- 課程設(shè)計(jì)---pl0功能擴(kuò)充
- 課程設(shè)計(jì)---pl0功能擴(kuò)充
- pl0功能擴(kuò)充課程設(shè)計(jì)
- 課程設(shè)計(jì)---PL0功能擴(kuò)充.doc
- PL0功能擴(kuò)充課程設(shè)計(jì).doc
- 編譯原理pl0課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告---pl0編譯程序改進(jìn)及完善
- 編譯原理實(shí)驗(yàn)報(bào)告pl0
- pl0擴(kuò)展編譯器_設(shè)計(jì)文檔
- 第二章pl0編譯程序-
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論