![語義分析實(shí)驗(yàn)報(bào)告三_第1頁](http://file4.renrendoc.com/view/a079208365e1c2aa71696a6a821a1ba5/a079208365e1c2aa71696a6a821a1ba51.gif)
![語義分析實(shí)驗(yàn)報(bào)告三_第2頁](http://file4.renrendoc.com/view/a079208365e1c2aa71696a6a821a1ba5/a079208365e1c2aa71696a6a821a1ba52.gif)
![語義分析實(shí)驗(yàn)報(bào)告三_第3頁](http://file4.renrendoc.com/view/a079208365e1c2aa71696a6a821a1ba5/a079208365e1c2aa71696a6a821a1ba53.gif)
![語義分析實(shí)驗(yàn)報(bào)告三_第4頁](http://file4.renrendoc.com/view/a079208365e1c2aa71696a6a821a1ba5/a079208365e1c2aa71696a6a821a1ba54.gif)
![語義分析實(shí)驗(yàn)報(bào)告三_第5頁](http://file4.renrendoc.com/view/a079208365e1c2aa71696a6a821a1ba5/a079208365e1c2aa71696a6a821a1ba55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《編譯系統(tǒng)設(shè)計(jì)實(shí)踐》實(shí)驗(yàn)項(xiàng)目三:語義分析指導(dǎo)老師:組長(zhǎng):組員:
實(shí)驗(yàn)?zāi)康耐ㄟ^語法制導(dǎo)或翻譯模式生成中間代碼。實(shí)驗(yàn)內(nèi)容用與實(shí)驗(yàn)二相同的語言,編制語義分析程序。在自底向上語法分析基礎(chǔ)上設(shè)計(jì)語義規(guī)則(語法制導(dǎo)翻譯),將源程序翻譯為四元式輸出,若有錯(cuò)誤將錯(cuò)誤信息輸出。程序設(shè)計(jì)與實(shí)現(xiàn)1輸入待分析的字符串及編碼方案關(guān)鍵字:beginsyn=1ifsyn=2thensyn=3whilesyn=4dosyn=5endsyn=6一般標(biāo)示符:letter(letter|digit)*syn=10整數(shù):digit*syn=11運(yùn)算符和分隔符:+syn=13-syn=14*syn=15/syn=16:syn=17:=syn=18<syn=20<=syn=21<>syn=22>syn=23>=syn=24=syn=25;syn=26(syn=27)syn=28$syn=0出錯(cuò)syn=-1忽略空格2主要函數(shù)及設(shè)置語義過程(1)結(jié)構(gòu)體struct{char*result;char*ag1;char*op;char*ag2;}quad[20];用來描述四元表達(dá)式的結(jié)構(gòu)。(2)char*numtab[6]存放關(guān)鍵字(3)char*newtemp(){char*p;charm[8];p=(char*)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]='t';return(p);}為定義函數(shù)回送的臨時(shí)變量名,按t1,t2……的順序依次產(chǎn)生。(4)voidemit(char*result,char*ag1,char*op,char*ag2)該函數(shù)的功能是生成一個(gè)三地址語句送到四元式表達(dá)中.子程序?qū)崿F(xiàn)方式如下:voidemit(char*result,char*ag1,char*op,char*ag2){inti;i=0;while(quad[i].result!=NULL)i++;quad[i].result=result;quad[i].ag1=ag1;quad[i].op=op;quad[i].ag2=ag2;printf("%s%10s%10s%10s\n",quad[i].op,quad[i].ag1,quad[i].ag2,quad[i].result);}intscaner(charprog[])對(duì)待分析的字符串進(jìn)行分析生成編碼方案syn{inti;for(m=0;m<8;m++)token[m]=NULL;m=0;ch=prog[p++];while(ch=='')ch=prog[p++];if((ch>='a')&&(ch<='z'))//ch為字母字符{while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))//ch為字母字符或數(shù)字字符{token[m++]=ch;ch=prog[p++];}token[m++]='\0';n=0;for(i=0;i<6;i++)if(strcmp(token,numtab[i])==0)//字符串的比較 switch(i){case0:syn=1;n++;break;case1:syn=2;n++;break;case2:syn=3;n++;break;case3:syn=4;n++;break; case4:syn=5;n++;break;case5:syn=6;n++;break;} if(n==0)syn=10;p--;}elseif(ch>='0'&&ch<='9')//ch數(shù)字字符{n=0;while(ch>='0'&&ch<='9'){n=n*10+(ch-'0');ch=prog[p++];}syn=11;p--;}elseswitch(ch){case'<':token[m++]=ch; ch=prog[p++];if(ch=='>'){token[++m]=ch;syn=22;}elseif(ch=='='){token[++m]=ch;syn=21;}else{p--;syn=20;}break;case'>':token[m]=ch;ch=prog[p++];if(ch=='='){token[++m]=ch;syn=24;}else{p--;syn=23;}break;case'+':token[m]=ch;syn=13;break;case'-':token[m]=ch;syn=14;break;case'*':token[m]=ch;syn=15;break;case'/':token[m]=ch;syn=16;break;case':':token[m++]=ch;ch=prog[p++];if(ch=='='){token[m++]=ch;syn=18;}else{p--;syn=17;}break;case'=':token[m]=ch;syn=25;break;case';':token[m]=ch;syn=26;break;case'(':token[m]=ch;syn=27;break;case')':token[m]=ch;syn=28;break;case'$':syn=0;token[0]='$';break;default:syn=-1;}returnsyn;}chartoken[8]用來存放構(gòu)成單詞符號(hào)的字符串返回編碼syn(6)char*factor遇到空格跳過數(shù)字則{itoa(n,fplace,10);scaner(prog);}若"("和")"不匹配,并打印輸出未找到的字符返回fplace{char*fplace;char*expression();fplace=(char*)malloc(10);strcpy(fplace,"");if(syn==10)//字符{strcpy(fplace,token);//將標(biāo)識(shí)符token的值賦給fplacescaner(prog);//調(diào)用scaner()讀取下一個(gè)單詞符號(hào)}elseif(syn==11)//數(shù)字{itoa(n,fplace,10);scaner(prog);//調(diào)用scaner()讀取下一個(gè)單詞符號(hào)}elseif(syn==27){scaner(prog);fplace=expression();if(syn==28)scaner(prog);else{printf("')'notfound\n");kk=1;}}else{printf("'('notfound\n");kk=1;}return(fplace);}(7)char*term()處理"*"和"/"返回eplace{char*tp,*ep2,*eplace,*tt;tp=(char*)malloc(10);ep2=(char*)malloc(10);eplace=(char*)malloc(10);tt=(char*)malloc(10);strcpy(eplace,factor());while((syn==15)||(syn==16)){if(syn==15)strcpy(tt,"*");elsestrcpy(tt,"/");scaner(prog);strcpy(ep2,factor());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}returneplace;}(8)char*expression()處理"+"和"-"返回eplace{char*tp,*ep2,*eplace,*tt;tp=(char*)malloc(10);ep2=(char*)malloc(10);eplace=(char*)malloc(10);tt=(char*)malloc(10);strcpy(eplace,term());while(syn==13||syn==14){if(syn==13)tt="+";elsett="-";scaner(prog);strcpy(ep2,term());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return(eplace);}(9)intstatement()判斷是否缺:=返回schain{chartt[10],eplace[10];intschain=0;switch(syn){case10:strcpy(tt,token);scaner(prog);if(syn==18){scaner(prog);strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{printf("':='ismissing\n");kk=1;}return(schain);}}(10)intyucu()跳過";"返回schain{intschain=0;schain=statement();while(syn==26){scaner(prog);schain=statement();}return(schain);}
3流程圖主程序流程圖置初值置初值調(diào)用scaner(prog)函數(shù)調(diào)用scaner(prog)函數(shù)忽略空格忽略空格是文件是否結(jié)束是文件是否結(jié)束否否數(shù)字?jǐn)?shù)字syn值字符串報(bào)錯(cuò)syn值字符串報(bào)錯(cuò)是否為關(guān)鍵字是否為關(guān)鍵字否否是是syn=10syn=10syn=11syn為相應(yīng)關(guān)鍵字的編碼值syn=11syn為相應(yīng)關(guān)鍵字的編碼值輸出4元組輸出4元組yucu函數(shù)結(jié)束調(diào)用statement函數(shù)結(jié)束調(diào)用statement函數(shù)是否為;是否為;是是出錯(cuò)處理調(diào)用scaner函數(shù)出錯(cuò)處理調(diào)用scaner函數(shù)調(diào)用statement函數(shù)調(diào)用statement函數(shù)statement函數(shù)否是否標(biāo)識(shí)符否是否標(biāo)識(shí)符是是調(diào)用scaner函數(shù)調(diào)用scaner函數(shù)否是否:=否是否:= 是是 出錯(cuò)處理調(diào)用scaner函數(shù)出錯(cuò)處理調(diào)用scaner函數(shù)調(diào)用expression函數(shù)調(diào)用expression函數(shù)term函數(shù)流程圖調(diào)用factor函數(shù)調(diào)用factor函數(shù)否是否為+或-否是否為+或-是是出錯(cuò)處理調(diào)用scaner函數(shù)出錯(cuò)處理調(diào)用scaner函數(shù)expression函數(shù)流程圖調(diào)用term函數(shù)調(diào)用term函數(shù)否是否為*或/否是否為*或/是是出錯(cuò)處理調(diào)用scaner函數(shù)出錯(cuò)處理調(diào)用scaner函數(shù)factor函數(shù)流程圖是是是否標(biāo)示符是否標(biāo)示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(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ù)學(xué)八年級(jí)下冊(cè)4.5《一次函數(shù)的應(yīng)用》聽評(píng)課記錄3
- 湘教版九年級(jí)數(shù)學(xué)下冊(cè)2.6弧長(zhǎng)與扇形面積第1課時(shí)弧長(zhǎng)聽評(píng)課記錄
- 八年級(jí)上冊(cè)道德與法治第一單元 走進(jìn)社會(huì)生活則 復(fù)習(xí)聽課評(píng)課記錄
- 蘇科版數(shù)學(xué)八年級(jí)下冊(cè)《9.1 圖形的旋轉(zhuǎn)》聽評(píng)課記錄2
- 蘇教版小學(xué)五年級(jí)上冊(cè)數(shù)學(xué)口算練習(xí)題
- 出國(guó)勞務(wù)派遣合同范本
- IT程序員保密協(xié)議書范本
- 深圳經(jīng)濟(jì)特區(qū)房產(chǎn)抵押貸款協(xié)議書范本
- 全國(guó)事業(yè)單位聘用合同范本
- 鄉(xiāng)村振興戰(zhàn)略合作合同范本
- 2024年內(nèi)蒙古中考語文試卷五套合卷附答案
- 2024年保密知識(shí)測(cè)試試題及答案(奪冠)
- 湖南2024年湖南省衛(wèi)生健康委直屬事業(yè)單位招聘276人筆試歷年典型考題及考點(diǎn)附答案解析
- SF-36生活質(zhì)量調(diào)查表(SF-36-含評(píng)分細(xì)則)
- 五年級(jí)下冊(cè)語文教案 學(xué)習(xí)雙重否定句 部編版
- 不需公證的遺囑范文
- 實(shí)驗(yàn)動(dòng)物與動(dòng)物福利
- 南京地區(qū)幼兒園室內(nèi)空氣污染物與兒童健康的相關(guān)性研究
- 2024年湖南鐵路科技職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫及答案解析
- (正式版)SHT 3115-2024 石油化工管式爐輕質(zhì)澆注料襯里工程技術(shù)規(guī)范
- (正式版)JBT 9630.1-2024 汽輪機(jī)鑄鋼件無損檢測(cè) 第1部分:磁粉檢測(cè)
評(píng)論
0/150
提交評(píng)論