版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、遼寧師范大學計算機與信息技術學院綜合性實驗報告課程名稱: 編譯技術 實驗題目:語法制導四元式(算術表達式)生成器 學生姓名: 專業(yè): 計算機科學與技術 學號: 實驗日期: 2015.06.05 【實驗目的】 1. 理解語法分析器原理、語法制導翻譯的過程實質。2. 學會將語法分析所識別的語法成分變換為中間代碼形式中的逆波蘭記號形式的語義分析方法,編程實現在對一個算術表達式進行語法分析過程的基礎上進行語義分析。 【實驗內容】 1. 輸入算術表達式源語言形式,輸出語法分析過程(輸入流變化過程)和四元式序列。2. 對于一個給定的算術表達式,首先通過詞法分析過程識別出各類語法成分輸出至文件中,然后采用預
2、測分析的方法對其進行分析和語法檢查,并給出具體的分析過程,包括分析步驟、分析棧、剩余符號以及所用的產生式。在此基礎上,向文法中插入語義動作,在語法分析過程中遇到語義動作就做相應的翻譯工作,最終將結果(算術表達式的逆波蘭式)輸出到源文件中?!緦嶒炦^程】一、判斷文法是否為LL(1)文法(1)E-E+E (2)E-E*E (3)E-i|-E由于此文法含左遞歸,消除左遞歸,確定算法優(yōu)先次序,使文法變?yōu)椋?1)E-TG(2)G-+TG|(3)T-FS(4)S-*FS|(5)F-i|-E1.可推出的非終結符表為:EGTSF否是否是否2.各非終結符的FIRST集合如下:FIRST(E)=(,iFIRST(G
3、)=+, FIRST(T)=(,iFIRST(S)=*, FIRST(F)=(,i3.各非終結符的FOLLOW集合為:FOLLOW(E)=),#FOLLOW(G)=),#FOLLOW(T)=+,),#FOLLOW(S)=+,),#FOLLOW(F)=*,+,),#4.各產生式的SELECT集合為:SELECT(E-TG)=(,iSELECT(G-+TG)=+SELECT(G-)=),#SELECT(T-FS)=(,iSELECT(S-*FS)=*SELECT(S-)=+,),#SELECT(F-E)=(SELECT(F-i)=i5.因為:SELECT(G-+TG)SELECT(G-) = +)
4、,# = SELECT(S-*FS)SELECT(S-) = *+,),# = SELECT(F-E)SELECT(F-i) = i( = 所以文法是LL(1)文法。二、構造預測分析表i+*()-#ETGTG-EG+TGTFSFSS*FSFi(E)三、程序開始1.預測試的算術表達式:4+(-4.67e-10)*(-7.89)+5# 分析后:i+(-i)*(-i)+i#寫入文件中。邊分析邊編織逆波蘭式,用數組stack1存放。1. 存入9個文法產生式:E-TGE2-EG-+TGG2-T-FSS-*FSS2-F-iF2-(E)2. 存入預測分析表格(如二)3. 利用 終結符數組:vt;非終結符數組
5、:vn;預測分析表table;分析棧stack;等等,對待分析串str2進行分析,并將分許過程存入op.txt中。具體代碼如下:#include#include#include#include char str220=0;/存放識別后的字符串“i+(-i)*(-i)+i#”FILE *op;/存儲算術表達式的文件“a+(-4.67e-10)*(-7.89)+b#”FILE *fp;/存儲分析過程的文件char vt7=i,+,*,(,),-,#; /終結符char vn5=E,G,T,S,F;/非終結符typedef struct type /產生式類型定義char left; /非終結符ch
6、ar right5; /產生式右邊字符 type;type E,E1,G,G1,T,S,S1,F,F1;/8個產生式type table77;/預分析表char stack30=0;/分析棧char stack130=0;/存儲逆波蘭式的int s=-1,st=0;/s-棧頂,st-當前需分析字符void analy1(char str1)/分析=i+(-i)*(-i)+i#int i=0,j=0,p=0,q=0;char s30=0;/輔助堆棧while(str1i!=#)switch(str1i)case a:str2j+=i;stack1q+=a; break;case b:str2j+
7、=i; stack1q+=sp-2; stack1q+=s-p;sp-=0;sp=0; stack1q+=b; break;case +:sp+=+;str2j+=+;break;case *:stack1q+=s-p;sp=0;str2j+=*;sp+=*;break;case (:str2j+=(;break;case ):stack1q+=s-p;sp=0; stack1q+=b; str2j+=);break;case -:sp+=; if(str2j-1=i)break; elsestr2j+=-; break;case .:stack1q+=.;if(str2j-1=i)break
8、;else str2j+=i;break;case 0:stack1q+=0;if(str2j-1=i)break;else str2j+=i;break;case 1:stack1q+=1;if(str2j-1=i)break;else str2j+=i; break;case 2:stack1q+=2;if(str2j-1=i)break; else str2j+=i;break;case 3: stack1q+=3;if(str2j-1=i)break; else str2j+=i; break;case 4: stack1q+=4;if(str2j-1=i)break; else st
9、r2j+=i; break;case 5:stack1q+=5;if(str2j-1=i)break; else str2j+=i;break;case 6: stack1q+=6;if(str2j-1=i)break; else str2j+=i; break;case 7:stack1q+=7;if(str2j-1=i)break; else str2j+=i; break;case 8: stack1q+=8;if(str2j-1=i)break; else str2j+=i; break;case 9: stack1q+=9;if(str2j-1=i)break; else str2j
10、+=i; break;case e:stack1q+=s-p;sp=0;if(str2j-1=i) sp+=e; break; else str2j+=i; break;i+;stack1q+=s-p;sp=0;str2j=#;void store()/將8個產生式存入printf(產生式:n);E.left=E;strcpy(E.right,TG);printf(%c-%sn,E.left,E.right);E1.left=E;strcpy(E1.right,-E);printf(%c-%sn,E1.left,E1.right);G.left=G;strcpy(G.right,+TG);pr
11、intf(%c-%sn,G.left,G.right);G1.left=G;strcpy(G1.right,);printf(%c-%sn,G1.left,G1.right);T.left=T;strcpy(T.right,FS);printf(%c-%sn,T.left,T.right);S.left=S;strcpy(S.right,*FS);printf(%c-%sn,S.left,S.right);S1.left=S;strcpy(S1.right,);printf(%c-%sn,S1.left,S1.right);F.left=F;strcpy(F.right,i);printf(%
12、c-%sn,F.left,F.right);F1.left=F;strcpy(F1.right,(E);printf(%c-%snn,F1.left,F1.right);int length(char a)/求數組長度int i,l=0;for(i=0;i5;i+)if(ai!=0) l+;return l;void tables()/建立分析表int i,j;for(i=0;i=4;i+)/初始化分析表for(j=0;j=6;j+)tableij.left=N;/表內所有l(wèi)eft置Ntable05=E1; table00=table03=E; /存入文法table11=G; table14=
13、table16=G1; table20=T; table23=T;table32=S; table31=table34=table36=S1; table40=F; table43=F1;printf(表達式文法的預測分析表:n);printf( t);for(i=0;i7;i+) printf(%ct,vti);printf(n);for(i=0;i5;i+)printf(%ct,vni);for(j=0;j-1; i- )stack+s=tablehl.righti;/產生式逆序入棧if(stacks=)stacks-=0;fputc(tablehl.left,fp);write(-);w
14、rite(tablehl.right);write(n);void print(int n)/寫入文件fprintf(fp,%dtt,n+);/步驟fprintf(fp,%stt,stack);/分析棧fprintf(fp,%stt,str2);/剩余輸入串void analy2()int i,j,n=0,finish=0,h,l;char X,a;store();/產生式tables();/預測分析表格write(*分析如下*n);write(步驟tt分析棧tt剩余字符tt所用產生式n);stack+s=#;/#入棧stack+s=E;/E入棧a=str2st;/當前剩余串最左字符while
15、(s-1)X=stacks;/棧頂字符print(+n);for(i=0;i5;i+)if(X=vni)/棧頂為非終結符時E G T S Fh=i;/行號for(j=0;j7;j+)if(a=vtj)l=j;/列號break;if(tablehj.left!=N)/不空時fun(h,l);for(i=0;i7;i+)/棧頂為終結符時i + * ( ) - #if(X=vti)stacks-=0;str2st+= ;a=str2st;/當前剩余串最左字符fputc(X,fp);if(X=#)write(接受n);else write(匹配n);void main()char str1300=0;/預分析算術表達式a+(-4.67e-10)*(-7.89)+b#char h=n;fp=fopen(H:fp.txt,r);fgets(str1,300,fp);/fgets讀取一行 fgetc讀取一個字符 fread想要的長度fclose(fp);analy1(str1);fp=fopen(H:fp.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026屆江蘇鎮(zhèn)江市高二生物第一學期期末質量檢測試題含解析
- 吉林省公主嶺市第五高級中學2026屆數學高二上期末聯(lián)考試題含解析
- 2026屆云南省文山州富寧縣一中數學高二上期末監(jiān)測試題含解析
- 8.1堅守公平+課件-2025-2026學年道德與法治八年級上冊 統(tǒng)編版
- 2026屆湖北省巴東三中高一生物第一學期期末調研模擬試題含解析
- 2026屆江蘇省五校英語高三第一學期期末聯(lián)考試題含解析
- 2026屆湖北省武漢市達標名校高一上數學期末預測試題含解析
- 甘肅省臨夏市2026屆高一生物第一學期期末經典模擬試題含解析
- 2026屆浙江省寧??h十校聯(lián)考英語高三第一學期期末經典模擬試題含解析
- 2026屆湖北省荊州市成豐學校數學高三上期末復習檢測試題含解析
- 解讀(2025年版)輸卵管積水造影診斷中國專家共識
- 高職院校技能大賽指導手冊
- 軌道交通廢棄物處理-洞察及研究
- 2024年一建網絡圖案例專題
- 水泥廠安全檢查表
- 預制管樁防擠施工方案
- 挖掘機銷售年終總結報告
- 農村會計考試試題及答案
- 集成電路測試技術與實踐 課件 4集成電路測試運算放大器參數測試
- T-CES 166-2022 海上風電柔性直流送出控制與保護系統(tǒng)技術規(guī)范
- 公路養(yǎng)護養(yǎng)護安全操作手冊
評論
0/150
提交評論