資源描述:
《實驗二 語法分析(算符優(yōu)先) (2)》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、編譯原理實驗報告實驗名稱:語法分析器設計專業(yè):計算機科學與技術姓名:田莉莉?qū)W號:201117906語法分析—算符優(yōu)先分析程序一.實驗要求⑴選擇最有代表性的語法分析方法,如算符優(yōu)先法、遞歸子程序法或LR分析法⑵選擇對各種常見程序語言都用的語法結構,如賦值語句(尤指表達式)作為分析對象,并且與所選語法分析方法要比較貼切。⑶實習時間為6學時。二.實驗內(nèi)容及要求(1)根據(jù)給定文法,先求出FirstVt和LastVt集合,構造算符優(yōu)先關系表(要求算符優(yōu)先關系表輸出到屏幕或者輸出到文件);(2)根據(jù)算法和優(yōu)先
2、關系表分析給定表達式是否是該文法識別的正確的算術表達式(要求輸出歸約過程)(3)給定表達式文法為:G(E’):E’→#E#E→E+T
3、TT→T*F
4、FF→(E)
5、i(4)分析的句子為:(i+i)*i和i+i)*i三.程序設計思想及實現(xiàn)步驟程序的設計思想:按照編譯原理教材提供的算法,本程序的設計主要實現(xiàn)三個主要的過程:(1)求解FristVT集和LastVT集:利用CString數(shù)組存放VT集,利用數(shù)組下標對應非終結符關系;(2)輸出算符優(yōu)先分析表:利用MFC中的ClistCtrl控件輸出顯示算符表
6、,比利用二維數(shù)組對應其在內(nèi)存中的關系。(3)利用算符優(yōu)先分析表進行歸約:根據(jù)教材所給算法,并對其進行實現(xiàn)在屏幕上輸出歸約過程。實現(xiàn)步驟:1、為程序各變量設計存儲形式,具體設計如下所示:CStringm_strTElem[T_LEN];//終結符CStringm_strNTElem[NT_LEN];//非終結符CMapStringToPtrm_mapProdu;//存放產(chǎn)生式CMapStringToPtrm_mapProduEX;//存放擴展產(chǎn)生式CStringm_strFristVT[NT_LEN
7、];//fristVT集CStringm_strLastVT[NT_LEN];//lastVT集intm_nPriSheet[T_LEN+1][T_LEN+1];//優(yōu)先表;無窮大表示空白,-1表示小于,0表示相等,1表示大于Findm_F[STACK_LEN];//bool數(shù)組CStrackm_stack;//堆棧2、為程序設計各個過程,具體設計如下所示:voidCreateFristVT(Find*F);//為每一個非終結符創(chuàng)建FristVT集voidCreateLastVT(Find*F);
8、//為每一個非終結符/創(chuàng)建LastVT集voidSearchPForFirtVT(Find&f);//搜索形如P->a….或P->Qa….的產(chǎn)生式voidSearchQForFristVT(void);//搜索形如P->....Q的產(chǎn)生式voidSearchPForLastVT(Find&f);//搜索形如P->...aQ或P->...a的產(chǎn)生式voidSearchQForLastVT(void);//搜索形如P->....Q的產(chǎn)生式OnBnClickedBtnAnasysic();//點擊按鈕啟
9、動分析3、對各個過程進行實現(xiàn);4、調(diào)試運行并檢驗實驗結果,結果如圖2.1和2.2所示:圖2.1分析成功圖圖2.2分析失敗圖四.程序源碼產(chǎn)生式初始化://產(chǎn)生式CString*str=newCString;*str=_T("
10、E+T
11、T
12、");m_mapProdu.SetAt(_T("E"),(void*)str);CString*str1=newCString;*str1=_T("
13、T*F
14、F
15、");m_mapProdu.SetAt(_T("T"),(void*)str1);CString*str
16、2=newCString;*str2=_T("
17、(E)
18、i
19、");m_mapProdu.SetAt(_T("F"),(void*)str2);CString*str3=newCString;*str3=_T("
20、E+T
21、F+F
22、F*F
23、E+F
24、T
25、F
26、");m_mapProduEX.SetAt(_T("E"),(void*)str3);CString*str4=newCString;*str4=_T("
27、T*F
28、F
29、");m_mapProduEX.SetAt(_T("T"),(void*)str4
30、);CString*str5=newCString;*str5=_T("
31、(E)
32、i
33、(F)
34、");m_mapProduEX.SetAt(_T("F"),(void*)str5);程序主要代碼:voidCGrammarAnalysisDlg::InitFind(void){inti,j;intk=0;while(k