語義分析實(shí)驗(yàn)報(bào)告三_第1頁
語義分析實(shí)驗(yàn)報(bào)告三_第2頁
語義分析實(shí)驗(yàn)報(bào)告三_第3頁
語義分析實(shí)驗(yàn)報(bào)告三_第4頁
語義分析實(shí)驗(yàn)報(bào)告三_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論