版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.實(shí) 驗(yàn) 三 詞法分析與語法分析程序設(shè)計(jì)實(shí)驗(yàn)日期: 2011 年 11 月 11日 評(píng)分 批閱教師簽字 一、實(shí)驗(yàn)?zāi)康幕菊莆沼?jì)算機(jī)語言的詞法分析程序和語法分析程序的設(shè)計(jì)方法二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)要求:1根據(jù)以下的正規(guī)式,畫出狀態(tài)圖;標(biāo)識(shí)符:(|)*關(guān)鍵字:if then else while do十進(jìn)制整數(shù):0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 運(yùn)算符和分隔符:+ - * / = ( ) ;2根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析函數(shù)int scan( ),從鍵盤讀入數(shù)據(jù),分析出一個(gè)單詞。3對(duì)于只含有+、*運(yùn)算的算術(shù)表達(dá)式的如下文法,編寫相應(yīng)的語法分析程序,要
2、求用LL(1)分析表實(shí)現(xiàn),并以id+id*id為例進(jìn)行測(cè)試:E TE E +TE| T FTT *FT|F (E)| id實(shí)驗(yàn)步驟1根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析算法2采用C+語言,實(shí)現(xiàn)該算法3調(diào)試程序:輸入一組單詞,檢查輸出結(jié)果。4 編制給定文法的非遞歸的預(yù)測(cè)分析程序,并加以測(cè)試。三、實(shí)驗(yàn)環(huán)境計(jì)算機(jī)、Windows 操作系統(tǒng)、Visual C+ 程序集成環(huán)境。四、實(shí)驗(yàn)原理(或程序框圖)及步驟LL(1)中的第一個(gè)L表示從左到右掃描輸入,第二個(gè)L表示產(chǎn)生最右推導(dǎo),而1則表示在每一步中只需要向前看一個(gè)輸入符號(hào)來決定語法分析動(dòng)作。構(gòu)造一個(gè)預(yù)測(cè)分析表如下:輸入:文法G輸出:預(yù)測(cè)分析表 M方法:對(duì)于文法G的每
3、個(gè)產(chǎn)生式A,進(jìn)行如下處理:1):對(duì)于FIRST()中的每個(gè)終結(jié)符a,將A加入到MA, 中。2):如果在FIRST()中,那么對(duì)于FOLLOW(A)中的每個(gè)終結(jié)符b,將A加入到MA, 中。如果在FIRST()中,且$在FOLLOW(A)中,也將A加入到MA, $中。完成上面操作之后,如果MA, 中沒有產(chǎn)生式,那么將MA, 設(shè)置為error。五、程序源代碼詞法分析函數(shù):struct key_kord char *word;int id;key_word keyword=if,1,then,2,else,3,while,4,do,5,integer,16;void scan (FILE *ftp)c
4、har temp_char;int i,c;while(!feof(ftp)temp_char=fgetc(ftp);if(isalpha(temp_char) TOKEN0=temp_char;temp_char=fgetc(ftp);i=1;while(isalnum(temp_char) TOKENi=temp_char;i+;temp_char=fgetc(ftp);TOKENi=0;fseek();c=lookup(TOKEN);if(c=0) out (ID,TOKEN);elseout (c, );else if(isdigit(temp_char)TOKEN0=temp_cha
5、r;temp_char=fgetc(ftp);i=1;while(isdigit(temp_char)TOKENi=temp_char;i+;temp_char=fgetc(ftp);TOKENi=0;fseek();out(INT,TOKEN);elseswitch(temp_char)case ) out(NE, );elsefseek();out(LT, );break;case =: out(EQ, ); break;case : temp_char=fgetc(ftp);if(temp_char=)out(GE, );elsefseek();(GT, );break;case : t
6、emp_char=fgetc(ftp);if(temp_char=) out(FZ, );elsefseek();report_error(temp_char);break;case /: temp_char=fgetc(ftp); if(temp_char=/)dotemp_char=fgetc(ftp);while(temp_char!=n);graphnum+;elsefseek();out(DEV, );break;case : break; case n: graphnum+; break; case : break; case -1 : break; default : repor
7、t_error(temp_char);break;return;LL(1)算法實(shí)現(xiàn):#define MAXSYMBOL 30temp_charar NT=E,A,T,B,F;temp_charar TE=i,+,*,(,(,);temp_charar *analysisTableMAXSYMBOL3= E,i,TG,E,+,E,*,E,(,TG,E,),E,#, A,i,A,+,+TA,A,*,A,(,A,),$,A,#,$, T,i,FB,T,+,T,*,T,(,FB,T,),T,#, B,i,B,+,$,B,*,*FB,B,(,B,),$,B,#,$, F,i,i,F,+,F,*,F,(,
8、(E),F,),F,#,;int Stack_Count(HEADSTACK *head) int count=0; if(head-stackHead=NULL) return 0; TEMP_CHARARSTACK *currentNode=head-stackHead; while(currentNode!=NULL) currentNode=currentNode-nextNode; count+; return count;HEADSTACK *Stack_Init() HEADSTACK *headNode=(HEADSTACK *)malloc(sizeof(HEADSTACK)
9、; headNode-stackHead=NULL; return headNode;void Stack_Push(HEADSTACK *head,temp_charar temp_char) TEMP_CHARARSTACK *currentNode,*tail; tail=(TEMP_CHARARSTACK *)malloc(sizeof(TEMP_CHARARSTACK); tail-temp_char=temp_char; tail-nextNode=NULL; if(head-stackHead=NULL) head-stackHead=tail; return; currentN
10、ode=head-stackHead; while(currentNode-nextNode!=NULL) currentNode=currentNode-nextNode; currentNode-nextNode=tail; currentNode=tail; currentNode-nextNode=NULL;TEMP_CHARARSTACK Stack_Pop(HEADSTACK *head) TEMP_CHARARSTACK *currentNode,*tail,popNode; if(head-stackHead=NULL) printf(Error:The Stack does
11、not has noden); return popNode; currentNode=tail=head-stackHead; if(tail-nextNode=NULL) popNode.temp_char=tail-temp_char; popNode.nextNode=NULL; head-stackHead=NULL; return popNode; while (tail-nextNode!=NULL) tail=tail-nextNode; if(tail-nextNode=NULL) currentNode-nextNode=NULL; popNode.temp_char=ta
12、il-temp_char; popNode.nextNode=tail-nextNode; return popNode; currentNode=currentNode-nextNode; bool IsNT(temp_charar temp_char) for(int i=0;isizeof(NT)/sizeof(temp_charar);i+) if(temp_char=NTi) return true; return false;bool IsTE(temp_charar temp_char) for(int i=0;isizeof(TE)/sizeof(temp_charar);i+) if(temp_char=TEi) return true; return false; temp_charar* GetMatrixValue(temp_charar NT,temp_charar TE) temp_charar nt2,te2; nt0=NT; nt1=0; te0=TE; te1=0; for(int i=0;i-1;j-) Stack_Push(head,concludej); else
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度船舶工程技術(shù)研究與成果轉(zhuǎn)化合同
- 二零二五年度電子設(shè)備維修工雇傭責(zé)任免除合同
- 2025年度旅游安全風(fēng)險(xiǎn)評(píng)估與防范合同4篇
- 2025年度智能家居定制安裝工程勞務(wù)分包合同范本4篇
- 2025年度煤礦基建施工安全責(zé)任追究與賠償合同4篇
- 二零二五版老舊小區(qū)改造裝修勞務(wù)分包合同4篇
- 2025年食堂食品安全檢測(cè)與施工管理合同3篇
- 2025年度苗木種植與農(nóng)業(yè)科技研發(fā)合作合同3篇
- 水庫漁業(yè)養(yǎng)殖二零二五年度病害防治承包合同2篇
- 2024版加盟店合同范本合作協(xié)議
- 教師招聘(教育理論基礎(chǔ))考試題庫(含答案)
- 2024年秋季學(xué)期學(xué)校辦公室工作總結(jié)
- 鋪大棚膜合同模板
- 長(zhǎng)亭送別完整版本
- 智能養(yǎng)老院視頻監(jiān)控技術(shù)方案
- 你比我猜題庫課件
- 無人駕駛航空器安全操作理論復(fù)習(xí)測(cè)試附答案
- 建筑工地春節(jié)留守人員安全技術(shù)交底
- 默納克-NICE1000技術(shù)交流-V1.0
- 蝴蝶蘭的簡(jiǎn)介
- 老年人心理健康量表(含評(píng)分)
評(píng)論
0/150
提交評(píng)論