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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:語(yǔ)法分析器構(gòu)造指導(dǎo)教師: 姓名: 班級(jí):學(xué)號(hào):實(shí)驗(yàn)成績(jī):實(shí)驗(yàn)題目語(yǔ)法分析器 實(shí)驗(yàn)?zāi)康暮鸵髮?shí)驗(yàn)?zāi)康模涸谡Z(yǔ)法分析器原理學(xué)習(xí)和詞法分析器實(shí)驗(yàn)基礎(chǔ)上,學(xué)生自行設(shè)計(jì)實(shí)現(xiàn)一個(gè)高級(jí)語(yǔ)言語(yǔ)法分析器。通過(guò)實(shí)驗(yàn)使學(xué)生能夠把原理和實(shí)現(xiàn)方法應(yīng)用到如搜索引擎、描述語(yǔ)言語(yǔ)法分析等詞法分析器的設(shè)計(jì)中去。借助于詞法分析程序提供的分析結(jié)果,設(shè)計(jì)一個(gè)算符優(yōu)先語(yǔ)法分析程序,程序能進(jìn)行語(yǔ)法結(jié)構(gòu)分析和錯(cuò)誤檢查并產(chǎn)生相應(yīng)的歸約信息。同時(shí)給出出錯(cuò)信息和錯(cuò)誤類(lèi)型,從而加深對(duì)語(yǔ)法分析的理解。實(shí)驗(yàn)要求:實(shí)驗(yàn)結(jié)束寫(xiě)出實(shí)驗(yàn)報(bào)告。內(nèi)容包括:實(shí)驗(yàn)課題名稱(chēng)、實(shí)驗(yàn)?zāi)康暮鸵?,?shí)驗(yàn)的實(shí)現(xiàn)(包括主要設(shè)計(jì)思想

2、、實(shí)現(xiàn)算法、主要技術(shù)問(wèn)題的處理方法及實(shí)驗(yàn)結(jié)果)結(jié)論分析。設(shè)計(jì)思想與框架設(shè)計(jì)思想與框架:通過(guò)課堂教學(xué)詳細(xì)講解語(yǔ)法分析器的基本原理,以及設(shè)計(jì)實(shí)現(xiàn)的基本方法,并通過(guò)一個(gè)實(shí)際語(yǔ)法分析器的案例分析,示范設(shè)計(jì)實(shí)現(xiàn)過(guò)程中的關(guān)鍵技術(shù)和技術(shù)難點(diǎn),一般不規(guī)定具體的實(shí)現(xiàn)語(yǔ)言。首先規(guī)定算符,這里是文法的終極符之間的優(yōu)先關(guān)系,然后根據(jù)這種優(yōu)先關(guān)系,通過(guò)比較相鄰算符的優(yōu)先次序來(lái)確定句型中的“句柄”,然后進(jìn)行歸約。   算符優(yōu)先分析法的關(guān)鍵:算符優(yōu)先分析法的關(guān)鍵就是尋找當(dāng)前句型中的最左素短語(yǔ),并歸約它。核心算法核心算法:語(yǔ)法分析前首先要對(duì)輸入的文法和句子進(jìn)行詞法分析,去除多余的字符(空格、回車(chē)符等),并

3、將產(chǎn)生式和終結(jié)符、非終結(jié)符填入有關(guān)數(shù)組,為語(yǔ)法分析做前期準(zhǔn)備。用于構(gòu)建輸入文法的算符優(yōu)先表,并在構(gòu)建過(guò)程中檢查該文法是否為算符優(yōu)先文法,如果在構(gòu)建過(guò)程中對(duì)同一對(duì)終結(jié)符計(jì)算出兩次不一樣的優(yōu)先關(guān)系,則報(bào)錯(cuò)并停止接下來(lái)的任何步驟。源程序及注釋本語(yǔ)法分析器所分析的源程序?yàn)椋?include <stdio.h>int main()int a,b,c;a=1;b=2;c=a+b; c=2*(a+b);printf("c=%dn",c);語(yǔ)法分析程序?yàn)椋?include<stdio.h>#include<stdlib.h>#include<str

4、ing.h>/存放歸約步驟的一個(gè)整形數(shù)組/int step_result1000;/存放歸約步驟的一個(gè)全局?jǐn)?shù)組int step_result_len=0;/統(tǒng)計(jì)全局?jǐn)?shù)組的長(zhǎng)度每次清零應(yīng)該/定義文法符號(hào)優(yōu)先表用int型矩陣表示/int Matux88=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1, -1,-1,-1,-1,-1,0,-1,-3,1,1,1,1,-2,1,-2,1,1,1,1,1,-2,1,-2,1,-1,-1,-1,-1,-1,-4,-1,0; char *STR6=&

5、quot;N+N","N-N","N*N","N/N","(N)","i"/定義文法可規(guī)約可歸約字符串char stack100;/定義符號(hào)棧int stack_len=0;/定義初始化符號(hào)棧的長(zhǎng)度為0int Getchar_len=0;/定義取得字符的全局在竄中的變量/bool IsLetter(char ch)/判斷當(dāng)前ch是否為字符/if(ch>='a'&&ch<='z')|(ch>='A'&

6、;&ch<='Z')return 1;/如果ch是字母則返回1elsereturn 0;/如果不是字母則返回0bool IsDigit(char ch)/判斷當(dāng)前ch是否為數(shù)字/if(ch>='0'&&ch<='9')return 1;/如果ch是數(shù)字則返回1elsereturn 0;/如果不是數(shù)字則返回0/求出終結(jié)符對(duì)應(yīng)的優(yōu)先表矩陣中的行列位置的函數(shù)/int Find_two_table(char ch)/求出對(duì)應(yīng)的優(yōu)先表的行數(shù)和列數(shù)的一個(gè)函數(shù)switch(ch) case '+': r

7、eturn 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; case 'i': return 6; case '#': return 7; default: return -1;/根據(jù)預(yù)處理求出算數(shù)分析的表達(dá)式存放在一個(gè)二維數(shù)組里面的一個(gè)函數(shù)/int Find_num_string(char num_string100100)

8、int i,j,flag;char ch,old_ch=' ',string20;FILE *fp;printf("您好!請(qǐng)您輸入預(yù)處理程序的文件名稱(chēng):");gets(string);if(fp=fopen(string,"r")=NULL) /打開(kāi)文件,如果打開(kāi)失敗則提示printf("您打開(kāi)的文件不存在,請(qǐng)您重新打開(kāi)文件n");/文件打開(kāi)失敗 提示打開(kāi)的文件不存在i=0;while(!feof(fp)j=0;ch=fgetc(fp);while(ch!='='&&!feof(fp)o

9、ld_ch=ch;ch=fgetc(fp);if(old_ch!='>'&&old_ch!='<'&&old_ch!='!')ch=fgetc(fp);if(ch!='=')while(ch!=''&&!feof(fp)num_stringij=ch;ch=fgetc(fp);j+;i+;num_stringij='0'flag=i-1;fclose(fp);return flag;/將求出的算術(shù)表達(dá)式轉(zhuǎn)化成可輸入串的函數(shù)/void Con

10、vert_input_string(char num_string100,char input_string100)int i=0,i_input_str=0;char ch,flag_ch;/begin/ch=num_stringi;while(ch!='0')if(IsDigit(ch)flag_ch='0' else if(IsLetter(ch)flag_ch='a' elseflag_ch=ch; switch(flag_ch) case 'a': while(IsLetter(ch)|IsDigit(ch)|ch=&#

11、39;_')&&ch!='0') i+; ch=num_stringi; input_stringi_input_str='i' i-; break; case '0': while(IsDigit(ch)|ch='.')&&ch!='0') i+; ch=num_stringi; input_stringi_input_str='i' i-; break; case ' ': break; default : input_stringi_in

12、put_str=ch; break; i+;ch=num_stringi;if(ch!=' ')i_input_str+;input_stringi_input_str='#'/end/return;/自動(dòng)取得是規(guī)約串中字符的一個(gè)函數(shù)/char Getchar(char input_string100)char ch;int i,len;char input_string_temp100='0'len=strlen(input_string);ch=input_string0;for(i=1;i<len;i+)input_string_te

13、mpi-1=input_stringi;if(input_stringi-1='#')break;strcpy(input_string,input_string_temp);return ch;/判斷是否是終結(jié)符/bool Char_IsVt(char ch)if(Find_two_table(ch)>=0&&Find_two_table(ch)<=9)return 1;elsereturn 0;/判斷終結(jié)符之間的優(yōu)先關(guān)系的一個(gè)函數(shù)/int Find_relaion(char stack_ch,char ch)/找出終結(jié)符之間的優(yōu)先關(guān)系的一個(gè)函數(shù)i

14、nt row,lie,result;row=Find_two_table(stack_ch);lie=Find_two_table(ch);if(lie<0|lie>7)&&ch!='N')/printf("非法標(biāo)識(shí)符%c",ch);return -10;result=Matuxrowlie;return result;/返回終結(jié)符對(duì)應(yīng)的行數(shù)或者是列數(shù)/出錯(cuò)處理子程序/void Process_Error(int return_num)if(return_num=-2)/出錯(cuò)處理函數(shù),一共有三種錯(cuò)誤情況printf("E

15、rror!算術(shù)表達(dá)式缺少運(yùn)算符,請(qǐng)查看更改!n");elseif(return_num=-3)printf("Error!算術(shù)表達(dá)式缺少右括號(hào),請(qǐng)查看更改!n");elseif(return_num=-4)printf("Error!算術(shù)表達(dá)式缺少左括號(hào),請(qǐng)查看更改!n");return;/函數(shù)結(jié)束/處理一個(gè)算術(shù)表達(dá)式的規(guī)約過(guò)程的函數(shù)/void main_analyous(char input_string100)int k,step=1,i,j,flag=0,p;int flag_temp=0,input_string_len;char ch

16、,q_ch;char stack100='0',temp_str20='0'k=1;stackk='#' printf("步驟號(hào) 動(dòng)作 優(yōu)先關(guān)系 當(dāng)前分析符 符號(hào)棧 剩余輸入串n"); printf(" 1 預(yù)備 < # %sn",input_string);ch=Getchar(input_string);char stack_pop=' 'while(stack_pop!='#')if(Char_IsVt(ch)j=k;elsej=k-1;int error;/判斷

17、輸入串中是不是存在非法符號(hào)的存在則返回-10/ error=Find_relaion(stackj,ch);if(error=(-10)printf("輸入串中存在非法符號(hào)%c,輸入串分析結(jié)束!n",ch);return;/while(Find_relaion(stackj,ch)=1)for(int h=0;h<20;h+)/每次規(guī)約過(guò)程中存放可歸約變量清零temp_strh='0'flag=0;/每次規(guī)約flag清零/doq_ch=stackj;if(Char_IsVt(stackj-1)j=j-1;elsej=j-2;while(Find_rel

18、aion(stackj,q_ch)=1)|(Find_relaion(stackj,q_ch)=0);/p=j+1;temp_strflag=stackp;/將stackj+1的字符給臨時(shí)數(shù)組temp+str中進(jìn)行和產(chǎn)生式右部進(jìn)行比較while(p<k)/循環(huán)一直到stackj+1=stackk結(jié)束p=p+1;flag+;temp_strflag=stackp;for(i=0;i<6;i+)if(strcmp(temp_str,STRi)=0)while(p<k)/循環(huán)一直到stackj+1=stackk結(jié)束每次規(guī)約的時(shí)候同時(shí)講規(guī)約部分的棧清空p=p+1;stackp=

19、9;0'k=j+1;stackk='N'/輸出歸約過(guò)程的一行的代碼/step+;step_resultstep_result_len=step;step_result_len+;printf("%4d ",step);printf(" 歸約 ");printf(" > ");printf("%7c ",ch);printf(" "); for(int r=1;r<=k;r+) printf("%c",stackr);for(r=0;r<

20、;12-k;r+) printf(" ");input_string_len=strlen(input_string); for(r=0;r<=input_string_len;r+) printf("%c",input_stringr);printf("n");/flag_temp=1;break;if(flag_temp=0)printf("Error!沒(méi)有這樣的產(chǎn)生式!n");/stackj+1到stackk規(guī)約過(guò)程結(jié)束/if(Find_relaion(stackj,ch)=-1)|(Find_rela

21、ion(stackj,ch)=0)k=k+1;stackk=ch;elseint error;error=Find_relaion(stackj,ch);Process_Error(error);return; /輸出歸約過(guò)程的一行的代碼/ step+; printf("%4d ",step); printf(" 移進(jìn) "); if(Find_relaion(stackj,ch)=-1) printf(" < "); if(Find_relaion(stackj,ch)=0) printf(" = "); p

22、rintf("%7c ",ch); printf(" "); for(int r=1;r<=k;r+) printf("%c",stackr); for(r=0;r<12-k;r+) printf(" ");input_string_len=strlen(input_string); for(r=0;r<=input_string_len;r+) printf("%c",input_stringr); printf("n");/ ch=Getchar(inp

23、ut_string); stack_pop=stackk; /判斷最終規(guī)約后的符號(hào)棧中是否是#N#形式,如果是那么久分析正確/if(stack1='#')&&(stack2='N')&&(stack3='#')printf("輸入的算術(shù)表達(dá)式正確!n");elseprintf("您輸入的算術(shù)表達(dá)式有錯(cuò)誤,請(qǐng)檢查!n");return;/打印每個(gè)算術(shù)表達(dá)式求解的歸約過(guò)程的一個(gè)函數(shù)/void Print_step()int i;for(i=0;i<step_result_l

24、en;i+)printf("%d ",step_resulti);printf("n"); step_result_len=0;/main()/ int main() int i,j,len,result;char num_string100100='0'char result_string100;printf("*算符優(yōu)先語(yǔ)法分析程序*n");printf("* E->E+T|E-T|T 分析的是四則混合運(yùn)算的文法 *n");printf("* T->T*F|T/F|F 其中

25、:E表示算術(shù)表達(dá)式;T表示項(xiàng); *n");printf("* F->(E)|i i表示變量或常數(shù); *n");printf("*n");printf("* 終結(jié)符優(yōu)先表 *n");printf("* + - * / ( ) i # *n");printf("* + > > < < < > < > *n"); printf("* - > > < < < > < > *n&quo

26、t;);printf("* * > > > > < > < > *n");printf("* / > > > > < > < > *n");printf("* ( < < < < < = < e1 *n");printf("* ) > > > > e2 > e2 > *n");printf("* i > > > > e2 > e2 > *n");printf("* # < < < < < e3 < = *n");printf("*n");printf("*n");len=F

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論