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