TINY擴(kuò)充語言的語法分析_第1頁
TINY擴(kuò)充語言的語法分析_第2頁
TINY擴(kuò)充語言的語法分析_第3頁
TINY擴(kuò)充語言的語法分析_第4頁
TINY擴(kuò)充語言的語法分析_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

需求分析程序功能:TINY擴(kuò)充語言的語法分析擴(kuò)充的語法規(guī)則:實(shí)現(xiàn)while、dowhile、for語句和求余計(jì)算式子。界面要求:采用MFC界面實(shí)現(xiàn)。提供一個源程序的編輯界面,以讓用戶輸入源程序(可保存、打開源程序),可由用戶選擇是否生成語法樹,并可查看所生成的語法樹。概要設(shè)計(jì)具體文法規(guī)則設(shè)計(jì):(1)While-stmt-->whileexpdostmt-sequenceendwhile(2)Dowhile-stmt-->dostmt-sequencewhileexp(3)For-stmt-->foridentifier:=simple-expto|downtosimple-expdostmt-sequenceenddoto步長遞增1,downto步長遞減1在課本附錄B代碼的基礎(chǔ)上進(jìn)行以上文法的擴(kuò)充。詳細(xì)設(shè)計(jì)擴(kuò)充文法while、dowhile、for語句的語法圖:更改變量名因?yàn)楦戒汢代碼中的變量TokenType和ERROR在MFC中已經(jīng)預(yù)先被使用,所以將它們改名為TokenType2和ERROR2.修改typedefenum{}TokenType2增加保留字: WHILE、DO、TO、DOWNTO、FOR、ENDDO、ENDWHILE增加求余運(yùn)算符:MOD修改typedefenum{}StmtKind增加語句類型:WhileK、DoWhileK、ForK修改staticstruct{char*str;TokenType2tok;}reservedWords[MAXRESERVED]={}增加保留字關(guān)聯(lián)字符{{"while",WHILE},{"endwhile",ENDWHILE}, {"do",DO},{"to",TO},{"downto",DOWNTO},{"for",FOR},{"enddo",ENDDO}};修改TreeNode*stmt_sequence(void){}函數(shù)增加stmt_sequence文法的follow集:(token!=ENDWHILE)&&(token!=WHILE)&&(token!=ENDDO)在parse.c文件中添加以下文法:TreeNode*while_stmt(void)//擴(kuò)充的while語句文法{TreeNode*t=newStmtNode(WhileK);match(WHILE);if(t!=NULL)t->child[0]=exp();match(DO);if(t!=NULL)t->child[1]=stmt_sequence();match(ENDWHILE);returnt;}TreeNode*dowhile_stmt(void)//擴(kuò)充的dowhile語句文法{TreeNode*t=newStmtNode(DoWhileK);match(DO);if(t!=NULL)t->child[0]=stmt_sequence();match(WHILE);if(t!=NULL)t->child[1]=exp();returnt;}TreeNode*for_stmt(void)//擴(kuò)充的for語句文法{TreeNode*t=newStmtNode(ForK);match(FOR);if((t!=NULL)&&(token==ID))t->=copyString(tokenString);match(ID);match(ASSIGN);if(t!=NULL)t->child[0]=simple_exp();if(token==TO)//步長遞增1 match(TO);if(token==DOWNTO)//步長遞減1 match(DOWNTO);if(t!=NULL) t->child[1]=simple_exp();match(DO);if(t!=NULL) t->child[2]=stmt_sequence();match(ENDDO);returnt;}MFC實(shí)現(xiàn)細(xì)節(jié):本程序在建立MFC工程時選用單文檔的應(yīng)用程序類型,最后的基類選擇CEditView。這樣建立起來的工程文件就提供了一個可編輯的輸入界面。生成語法樹和查看語法樹在MFC中的實(shí)現(xiàn):voidCMainFrame::OnTree()//生成語法樹按鈕{TreeNode*syntaxTree;charpgm[120];/*sourcecodefilename*/CStringstr;GetWindowText(str);//獲取窗口文件路徑strcpy(pgm,str);pgm[strlen(str)-8]='\0';//去掉文件路徑中無效的部分if(strchr(pgm,'.')==NULL)//保證文件后綴是.tnystrcat(pgm,".tny");source=fopen(pgm,"r+");if(source==NULL){fprintf(stderr,"File%snotfound\n",pgm);exit(1);}listing=fopen("Syntax_tree.txt","w+");//輸出語法樹到文本文件Syntax_tree.txt中fprintf(listing,"\nTINYCOMPILATION:%s\n",pgm);syntaxTree=parse();//生成語法樹if(TraceParse){fprintf(listing,"\nSyntaxtree:\n");printTree(syntaxTree);}fclose(source);fclose(listing);MessageBox("語法樹已生成!");}voidCMainFrame::OnShowTree()//查看語法樹按鈕{ //TODO:Addyourcommandhandlercodehere ShellExecute(NULL,"open","Syntax_tree.txt",NULL,NULL,SW_SHOW);//打開文本文件}調(diào)試分析設(shè)計(jì)中遇到的問題及解決:在程序編寫過程中遇到的主要問題是沒有修改TreeNode*stmt_sequence(void){}函數(shù),給stmt_sequence文法增加follow集:(token!=ENDWHILE)&&(token!=WHILE)&&(token!=ENDDO)。最后通過調(diào)試提示enddo或endwhile不是tiny程序正常結(jié)束的符號發(fā)現(xiàn)了這個問題。在用MFC實(shí)現(xiàn)時由于不知道TokenType和ERROR這兩個變量在MFC中已經(jīng)是預(yù)先被使用了的,所以程序老是出現(xiàn)錯誤提示,又找不出問題。后來經(jīng)過調(diào)試發(fā)現(xiàn)了這兩個變量在MFC中已經(jīng)被使用了。通過更名解決了這個問題。調(diào)試總結(jié):由于本程序大部分是使用了附錄B中的代碼,通過閱讀理解后再使用,所以減少了程序編寫中的不了問題。本程序雖然是實(shí)現(xiàn)了功能需求,但做得還是比較簡陋。生成的語法樹也只是把它保存在一個文本文件中,再通過調(diào)用ShellExecute函數(shù)打開它顯示。用戶手冊本程序的運(yùn)行環(huán)境為MFC界面,可執(zhí)行文件為:parse.exe用戶打開程序即可看到如下主界面:按下“打開”可以選擇tiny源文件打開,注意打開的源文件后綴為.tny按下“保存”可以保存輸入的tiny源程序,注意保存的文件后綴為.tny按下“查看語法樹”下拉菜單的“生成語法樹”就可以生成語法樹了,如果源程序是直接輸入的話,要先保存后才能生成語法樹。按下“查看語法樹”下拉菜單的“查看語法樹”就可以查看生成的語法樹。測試結(jié)果For語句文法測試:1)測試文件for_test.tny:readx;{inputaninteger}forx:=1toy+5dofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactenddo2)生成的語法樹:Syntaxtree:Read:xForConst:1Op:+Id:yConst:5Assignto:factConst:1RepeatAssignto:factOp:*Id:factId:xAssignto:xOp:%Id:xConst:2Op:=Id:xConst:0WriteId:factWhile語句文法測試:1)測試文件while_test.tny:readx;{inputaninteger}while0<xdofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactendwhile2)生成的語法樹:Syntaxtree:Read:xWhileOp:<Const:0Id:xAssignto:factConst:1RepeatAssignto:factOp:*Id:factId:xAssignto:xOp:%Id:xConst:2Op:=Id:xConst:0WriteId:factDowhile語句文法測試:1)測試文件dowhile_test.tny:readx;{inputaninteger}dofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactwhilex=02)生成的語法樹:Syntaxtree:Read:xDoAssignto:factConst:1RepeatAssignto:factOp:*Id:factId:

溫馨提示

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

評論

0/150

提交評論