版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p> 一.課程設(shè)計(jì)目的┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅2</p><p> 二.課程設(shè)計(jì)題目描述和要求┅┅┅┅┅┅┅┅┅┅┅┅┅┅2</p><p> 1、算術(shù)表達(dá)式的描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ ┅ 2</p><p> 2、課程設(shè)計(jì)要求
2、描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅2</p><p> 3、實(shí)現(xiàn)的功能描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅2</p><p> 5、分析器的使用描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅3</p><p> 三.課程設(shè)計(jì)實(shí)現(xiàn)描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅3</p><p> 1、實(shí)現(xiàn)平臺(tái)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
3、┅┅3</p><p> 課程設(shè)計(jì)基本思路描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅3</p><p> 指定向下與遞歸下降分析方法的基本原理描述┅┅┅┅┅┅4</p><p> 程序運(yùn)行的最后界面┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ 5</p><p> 演示分析┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅6</p><p>
4、 課程設(shè)計(jì)總結(jié)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅7</p><p> 實(shí)驗(yàn)中的代碼描述┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅7</p><p> 五.參考書(shū)目┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅19</p><p><b> 一、課程設(shè)計(jì)目的</b></p><p> 通過(guò)設(shè)計(jì)、編制、調(diào)試一個(gè)算術(shù)表達(dá)式的語(yǔ)
5、法及語(yǔ)義分析程序,加深對(duì)語(yǔ)法及語(yǔ)義分析原理的理解,并實(shí)現(xiàn)詞法分析程序?qū)卧~序列的詞法檢查和分析。</p><p> 加深對(duì)文法分析器的知識(shí)的掌握,掌握計(jì)算機(jī)語(yǔ)言的語(yǔ)法分析的過(guò)程。以及掌握計(jì)算機(jī)語(yǔ)言的語(yǔ)法分析程序設(shè)計(jì)與文法應(yīng)用的實(shí)現(xiàn)方法。能夠熟練運(yùn)用一種分析方法,自上而下或自下而上的方法分析一個(gè)給定的文法,我使用的是自上而下的分析方法。以及通過(guò)思考以及動(dòng)手制作分析器的過(guò)程來(lái)鍛煉自己的編程能力和邏輯思維能力,體會(huì)計(jì)
6、算機(jī)編譯器的奧妙之處。</p><p> 二、課程設(shè)計(jì)題目描述和要求</p><p> 1、算術(shù)表達(dá)式的文法的描述:</p><p> 〈無(wú)符號(hào)整數(shù)〉∷= 〈數(shù)字〉{〈數(shù)字〉}</p><p> 〈標(biāo)識(shí)符〉∷= 〈字母〉{〈字母〉|〈數(shù)字〉}</p><p> 〈表達(dá)式〉∷= 〈項(xiàng)〉{〈加法運(yùn)算符〉〈項(xiàng)〉}
7、</p><p> 〈項(xiàng)〉∷= 〈因子〉{〈乘法運(yùn)算符〉〈因子〉}</p><p> 〈因子〉∷= 〈標(biāo)志符〉|〈無(wú)符號(hào)整數(shù)〉</p><p> 〈加法運(yùn)算符〉∷= +|-</p><p> 〈乘法運(yùn)算符〉∷= *|/</p><p> 〈字母〉∷= a | b | … | z</p><
8、p> 〈數(shù)字〉∷= 0 | 1 | … | 9</p><p> 2、課程設(shè)計(jì)的要求描述:</p><p> 1)在遞歸下降法、LL(1)、算符優(yōu)先分析法或者LR法中選擇其中一種方法完成以上任務(wù),中間代碼選用四元式。</p><p> 2)編制分析程序,設(shè)計(jì)若干用例,并上機(jī)測(cè)試。</p><p> 3)書(shū)寫(xiě)課程設(shè)計(jì)報(bào)告。<
9、;/p><p> 4)要求提供單步運(yùn)行,讓用戶跟蹤分析器工作的每一個(gè)步驟。</p><p> 3、實(shí)現(xiàn)的功能描述:</p><p> 1)選定一種分析方法,本分析器采用遞歸下降分析方法進(jìn)行語(yǔ)法分析</p><p> 2)允許用戶手動(dòng)輸入算術(shù)表達(dá)式(每個(gè)項(xiàng)的長(zhǎng)度不大于10)</p><p> 3)對(duì)輸入的算術(shù)表達(dá)式
10、進(jìn)行詞法、語(yǔ)法、語(yǔ)義分析</p><p> 4)分別對(duì)詞法、語(yǔ)法、語(yǔ)義分析輸出相應(yīng)的執(zhí)行結(jié)果</p><p> 5)對(duì)詞法分析可輸出遞歸下降分析的步驟,以及相應(yīng)步驟所使用的產(chǎn)生式,對(duì)語(yǔ)義分析采用自頂向下分析方法,可輸出四元式表示的中間代碼。</p><p> 4、分析器的使用描述</p><p> 對(duì)于一個(gè)給定的算術(shù)表達(dá)式,在此分析器
11、中可直接點(diǎn)擊詞法分析按鈕,得到結(jié)果如左下角的第一個(gè)顯示框所示。在運(yùn)行分析器的過(guò)程中,輸入的是相對(duì)應(yīng)于文法所能夠產(chǎn)生的算術(shù)表達(dá)式進(jìn)行分析,如果是不符合文法的輸入串,那么就會(huì)提示錯(cuò)誤信息。首先在輸入表達(dá)式所對(duì)應(yīng)的編輯框中輸入所要分析的表達(dá)式,單擊詞法分析,在詞法分析輸出結(jié)果中可以查看算術(shù)表達(dá)式中使用的符號(hào)是否正確。之后單擊語(yǔ)法分析按鈕,在語(yǔ)法分析框中會(huì)出現(xiàn)相應(yīng)的遞歸下降分析步驟(包括分析過(guò)程中所使用的產(chǎn)生式)。單擊語(yǔ)義分析按鈕,在分析結(jié)果欄
12、中,顯示以四元式表示的中間代碼。分析結(jié)束時(shí),如果所輸入的算術(shù)表達(dá)式是屬于該文法的,那么語(yǔ)法分析輸出結(jié)果框中顯示:“輸入串是該文法的一個(gè)句子! 語(yǔ)法分析結(jié)束”</p><p> 若不屬于該文法,那么語(yǔ)法分析輸出結(jié)果框中顯示:“輸入串是該文法的一個(gè)句子! 語(yǔ)法分析結(jié)束”。果所輸入的算術(shù)表達(dá)式中接有錯(cuò)誤的字符,那么詞法分析輸出結(jié)果框中顯示:“接錯(cuò)誤后綴,出錯(cuò)”。</p><p> 三、課程設(shè)
13、計(jì)實(shí)現(xiàn)描述</p><p><b> 1、實(shí)現(xiàn)平臺(tái)</b></p><p> Microsoft Windows XP / Microsoft Visual C++ 6.0</p><p> 課程設(shè)計(jì)的基本思路描述</p><p> 首先應(yīng)該把用文字表示的文法改寫(xiě)為數(shù)學(xué)符號(hào)。(其中關(guān)于無(wú)符號(hào)整數(shù)和標(biāo)識(shí)符,由于可以
14、在詞法分析的過(guò)程中給以確定,所以就不必抽象其表達(dá)式。)</p><p><b> 設(shè):</b></p><p> indentifer :標(biāo)識(shí)符 digit : 無(wú)符號(hào)整數(shù)</p><p> E: 表達(dá)式 T:項(xiàng) F:因子</p><p> 則一個(gè)簡(jiǎn)單的術(shù)表達(dá)
15、式的文法G1中包含以下產(chǎn)生式:</p><p> E -> E+E | E-E | E*E | E/E | (E) | indentifer | digit </p><p> 為了明確運(yùn)算符的優(yōu)先權(quán)(括號(hào)的優(yōu)先權(quán)高于乘除法,乘除法的優(yōu)先權(quán)高于加減法),可改寫(xiě)文法G1如下:</p><p><b> 改寫(xiě)后的文法G2:</b><
16、;/p><p> E -> E+T | E-T | T</p><p> T -> T*F | T/F | F</p><p> F -> (E) | indentifer | digit </p><p> 為了避免左遞歸的發(fā)生,可進(jìn)一步將文法改成:</p><p><b> 文法G
17、[E]: </b></p><p> ?。?)E -> [+|-]TG</p><p> ?。?)G -> +TG|—TG</p><p><b> ?。?)G -> ε</b></p><p> ?。?)T -> FS</p><p> ?。?)S ->
18、 *FS|/FS</p><p><b> ?。?)S -> ε</b></p><p> ?。?)F -> (E)(8)F -> indentifer | digit </p><p> 3、指定向下與遞歸下降分析方法的基本原理描述</p><p><b> 自頂向下分析原理:</
19、b></p><p> 自頂向下分析就是從文法的開(kāi)始符號(hào)出發(fā),向下推導(dǎo),推出句子。分為:帶“回溯”的分析方法、不帶回溯的遞歸子程序(遞歸下降)分析方法。</p><p> 自頂向下分析的主旨:對(duì)任何輸入串,試圖用一切可能的辦法,從文法開(kāi)始符號(hào)(根結(jié)點(diǎn))出發(fā),自上而下、從左到右地為輸入串建立一棵分析樹(shù)?;蛘哒f(shuō),為輸入串尋找一個(gè)最左推導(dǎo)。其分析是一種試探的過(guò)程,是反復(fù)使用不同產(chǎn)生式謀
20、求與輸入序列匹配的過(guò)程。</p><p><b> 遞歸下降分析原理:</b></p><p> 遞歸的預(yù)測(cè)分析是為每一個(gè)非終結(jié)符寫(xiě)一個(gè)分析過(guò)程,這些過(guò)程可能是遞歸的在處理輸入串時(shí),首先執(zhí)行的是對(duì)應(yīng)開(kāi)始符號(hào)的過(guò)程,然后根據(jù)產(chǎn)生式右部出現(xiàn)的非終結(jié)符,依次調(diào)用相應(yīng)的過(guò)程,這種逐步下降的過(guò)程調(diào)用序列隱含地定義了輸入串的分析樹(shù)。</p><p>
21、 4、程序運(yùn)行的最后界面:</p><p> 當(dāng)輸入算術(shù)表達(dá)式為2+4*(5+4*2+9/3)+8時(shí),執(zhí)行結(jié)果如下圖所示:</p><p> 當(dāng)輸入串為2+!時(shí),執(zhí)行結(jié)果如下所示:</p><p> 當(dāng)輸入串為2+(3+*)^時(shí),執(zhí)行結(jié)果如下圖所示:</p><p><b> 5、演示分析</b></p&g
22、t;<p> 例如:對(duì)句子d+d+d*d的分析:</p><p> 設(shè)計(jì)該分析器的基本思路:輸入算術(shù)表達(dá)式→給出詞法分析結(jié)果→給出語(yǔ)法分析結(jié)果→給出語(yǔ)義分析結(jié)果 </p><p> 由于程序在執(zhí)行的過(guò)程中分為詞法、語(yǔ)法、語(yǔ)義,故在程序設(shè)計(jì)的時(shí)候也按照這種方式,把整個(gè)程序分成三個(gè)大的部分,即詞法分析部分,語(yǔ)法分析部分和語(yǔ)義分析部分。而且在各個(gè)部分的內(nèi)部采用模塊化設(shè)計(jì),再分
23、成各個(gè)小塊,各自完成其相對(duì)應(yīng)的功能。</p><p><b> 四、課程設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)本次對(duì)算術(shù)表達(dá)式的語(yǔ)法分析及語(yǔ)義分析器的設(shè)計(jì),使我加深了對(duì)文法分析器的知識(shí)的掌握,掌握了計(jì)算機(jī)語(yǔ)言的語(yǔ)法分析的過(guò)程。以及掌握了計(jì)算機(jī)語(yǔ)言的語(yǔ)法分析程序設(shè)計(jì)與文法應(yīng)用的實(shí)現(xiàn)方法。能夠熟練運(yùn)用遞歸下降分析方法,我使用的是自上而下的分析方法。以及通過(guò)思考以及動(dòng)
24、手制作分析器的過(guò)程鍛煉了自己的編程能力和邏輯思維能力。并通過(guò)設(shè)計(jì)、編制、調(diào)試一個(gè)算術(shù)表達(dá)式的語(yǔ)法及語(yǔ)義分析程序,使我加深了對(duì)語(yǔ)法及語(yǔ)義分析原理的理解,并實(shí)現(xiàn)詞法分析程序?qū)卧~序列的詞法檢查和分析。</p><p> 我認(rèn)為做好一個(gè)可視化的程序首先要做的工作是設(shè)計(jì)它界面,應(yīng)為一個(gè)好的界面設(shè)計(jì)好了,那么在設(shè)計(jì)界面的過(guò)程中可能會(huì)激發(fā)起編程的思路。做好一個(gè)項(xiàng)目的最主要的是要有恒心,雖然在做分析器的過(guò)程中遇到了很多的問(wèn)題
25、,剛開(kāi)始做的時(shí)候沒(méi)有什么頭緒,經(jīng)過(guò)和同學(xué)討論和在網(wǎng)上搜集相關(guān)問(wèn)題的答案,終于基本的問(wèn)題都能夠解決。</p><p> 經(jīng)過(guò)這次課程設(shè)計(jì),對(duì)語(yǔ)法分析有了更深入的了解,鞏固了上課期間所學(xué)的知識(shí)。對(duì)編譯原理的基本原理也有了一定的了解。</p><p> 五、實(shí)驗(yàn)中的代碼描述</p><p><b> a.詞法分析代碼:</b></p>
26、;<p> int Bds::cifa_main()//詞法分析主函數(shù)</p><p><b> {</b></p><p><b> int f;</b></p><p> cifa_head = new cifa;</p><p> cifa_head -> t
27、ype = -1;</p><p> cifa_head -> next = NULL;</p><p> cifa_end = cifa_head;</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("單詞種類(lèi)定義如下:");</p><p> ((CMATHDlg*)m_
28、pWnd)->InfoAdd4("");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("標(biāo)識(shí)符的種類(lèi)編碼 1 :");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("");</p><p> ((CMATHDlg*)
29、m_pWnd)->InfoAdd4("常數(shù)的種類(lèi)編碼 2 :");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("運(yùn)算的種類(lèi)編碼 3 :+ ,- ,* ,/ ");</p>
30、<p> ((CMATHDlg*)m_pWnd)->InfoAdd4("");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd4("界限符的種類(lèi)編碼 4 : (,),;");</p><p> GetChar();</p><p> notock();//空格跳過(guò)<
31、;/p><p> ((CMATHDlg*)m_pWnd)->InfoAdd1("詞法分析結(jié)果如下:");</p><p> while ( nn < 100 && ch != '^')</p><p><b> {</b></p><p> if ((c
32、h >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ) </p><p> f=alph(); //字母串</p><p> else if (ch >= '0' && ch &l
33、t;= '9') f=number(); //數(shù)字串</p><p> else f=test();//其他符號(hào)</p><p> if (f == 0) return (0);</p><p><b> } </b></p><p> cifa_disp(cifa_head);</p&g
34、t;<p> ((CMATHDlg*)m_pWnd)->InfoAdd1("詞法分析結(jié)束.");</p><p> return (1);</p><p><b> }</b></p><p> int Bds::test()//識(shí)別相關(guān)符號(hào) </p><p><
35、b> {</b></p><p> char temp[3];</p><p><b> int i=0;</b></p><p><b> int type;</b></p><p> switch (ch)</p><p><b>
36、 {</b></p><p> case ';' : //識(shí)別 ';'</p><p><b> {</b></p><p> temp[i++] = ch;</p><p> GetChar();</p><p> if (ch ==&
37、#39; ' ) temp[i++] =' ';</p><p> temp[i] = '\0';</p><p><b> type = 4;</b></p><p><b> break;</b></p><p><b> }</
38、b></p><p> case '+' : //識(shí)別 '+'</p><p><b> {</b></p><p> temp[i++] = ch;</p><p> GetChar();</p><p> if (ch =='
39、39; ) temp[i++] =' '; </p><p> temp[i] = '\0';</p><p><b> type = 3;</b></p><p><b> break;</b></p><p><b> }</b>&
40、lt;/p><p> case '-' : //識(shí)別 '-'</p><p><b> {</b></p><p> temp[i++] = ch;</p><p> GetChar();</p><p> if (ch ==' ' )
41、 temp[i++] =' '; </p><p> temp[i] = '\0';</p><p><b> type = 3;</b></p><p><b> break;</b></p><p><b> }</b></p&
42、gt;<p> case '*' : //識(shí)別 '*'</p><p><b> {</b></p><p> temp[i++] = ch;</p><p> GetChar();</p><p> if (ch ==' ' ) </p
43、><p> temp[i++] =' ';</p><p> temp[i] = '\0';</p><p><b> type = 3;</b></p><p><b> break;</b></p><p><b> }&l
44、t;/b></p><p> case '/' : //識(shí)別 '/'</p><p><b> {</b></p><p> temp[i++] = ch;</p><p> GetChar();</p><p> if (ch =='
45、 ' ) </p><p> temp[i++] =' ';</p><p> temp[i] = '\0';</p><p><b> type = 3;</b></p><p><b> break;</b></p><p>
46、;<b> }</b></p><p> case '(' : //識(shí)別 '('</p><p><b> {</b></p><p> temp[i++] = ch; </p><p> GetChar();</p><
47、;p> if (ch ==' ' ) </p><p> temp[i++] =' ';</p><p> temp[i] = '\0';</p><p><b> type = 4;</b></p><p><b> break;</b&g
48、t;</p><p><b> }</b></p><p> case ')' : // 識(shí)別')'</p><p><b> {</b></p><p> temp[i++] = ch; </p><p> Get
49、Char();</p><p> if (ch ==' ' ) </p><p> temp[i++] =' '; </p><p> temp[i] = '\0';</p><p><b> type = 4;</b></p><p
50、><b> break; </b></p><p><b> }</b></p><p><b> default :</b></p><p><b> { </b></p><p> CString report;</p>
51、<p> report.Format("%c",ch);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd1(report);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd1("無(wú)法識(shí)別,出錯(cuò)!");</p><p> GetChar();&
52、lt;/p><p> if (ch == ' ') </p><p><b> notock();</b></p><p> return (0);</p><p><b> }</b></p><p><b> }</b><
53、/p><p> if (ch == ' ') notock(); // 空格跳過(guò)</p><p><b> cifa *p;</b></p><p> p = new cifa;</p><p> p -> next = NULL;</p><p> p -&
54、gt; type = type;</p><p> strcpy(p->word,temp);</p><p> cifa_add(p); </p><p> return (1);</p><p><b> }</b></p><p> int Bds::number() /
55、/識(shí)別數(shù)字 </p><p><b> {</b></p><p> int type=2;</p><p><b> int i=0;</b></p><p> char temp[10];</p><p> while('0'<= ch &
56、amp;& ch <= '9')</p><p><b> {</b></p><p> temp[i] = ch;</p><p><b> i++;</b></p><p> GetChar();</p><p><b>
57、 }</b></p><p> temp[i]='\0';</p><p> if (ch == ' ') notock(); //空格跳過(guò)</p><p> else if (ch != '^' && ch != '+' && ch != '
58、-' && ch != ';' && ch != '*' && ch != '/' && ch != '('&& ch != ')')</p><p><b> {</b></p><p> ((C
59、MATHDlg*)m_pWnd)->InfoAdd1("接錯(cuò)誤后綴,出錯(cuò)");</p><p> return (0);</p><p><b> }</b></p><p> if (ch == ' ') notock(); </p><p><b> ci
60、fa *p;</b></p><p> p = new cifa;</p><p> p -> next = NULL;</p><p> p -> type = type;</p><p> strcpy(p->word,temp);</p><p> cifa_add(p);
61、</p><p> return (1);</p><p><b> }</b></p><p> int Bds::alph() //識(shí)別標(biāo)識(shí)符</p><p><b> {</b></p><p><b> int i=0;</b>&l
62、t;/p><p> char temp[10];</p><p> int type = 1;</p><p> temp[i] = ch;</p><p><b> i++;</b></p><p> GetChar();</p><p> while ((
63、ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'))</p><p><b> {</b></p
64、><p> temp[i] = ch;</p><p><b> i++;</b></p><p> GetChar();</p><p><b> }</b></p><p> temp[i] = '\0';</p><p>
65、 if (ch == ' ') notock();</p><p> else if (ch != '^' && ch != '+' && ch != '-' && ch != ';' &&ch != '*' && ch != '
66、;/' && ch != '('&& ch != ')')</p><p><b> {</b></p><p> ((CMATHDlg*)m_pWnd)->InfoAdd1("接錯(cuò)誤后綴,出錯(cuò)");</p><p><b> re
67、turn 0;</b></p><p><b> }</b></p><p><b> cifa *p;</b></p><p> p = new cifa;</p><p> p -> next = NULL;</p><p> p ->
68、type = type;</p><p> strcpy(p->word,temp);</p><p> cifa_add(p);</p><p> return (1);</p><p><b> }</b></p><p> cifa * Bds::cifa_add(cifa
69、*p)//在分析結(jié)果列表尾添加一個(gè)新接點(diǎn)</p><p><b> {</b></p><p> cifa_end -> next = p;</p><p> cifa_end = cifa_end -> next;</p><p> return cifa_head;</p>&l
70、t;p><b> }</b></p><p> void Bds::cifa_disp(cifa *cifa_head)//輸出詞法分析結(jié)果</p><p><b> {</b></p><p><b> cifa *p;</b></p><p> p = c
71、ifa_head -> next ;</p><p> while ( p != NULL)</p><p><b> {</b></p><p> CString report;</p><p> report.Format("(%2d , %s)",p->type,p-&g
72、t;word);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd1(report);</p><p> p = p ->next;</p><p><b> }</b></p><p><b> }</b></p><p>
73、void Bds::GetChar()//取字符</p><p><b> {</b></p><p> ch = str[nn];</p><p><b> nn++;</b></p><p><b> }</b></p><p> vo
74、id Bds::notock()//去掉空格</p><p><b> {</b></p><p> if ( ch == ' ' )</p><p> while ( ch == ' ' )</p><p> GetChar();</p><p>&l
75、t;b> }</b></p><p> void Bds::SetWnd(CDialog *pWnd)</p><p><b> {</b></p><p><b> //設(shè)置窗口指針</b></p><p> m_pWnd=pWnd;</p><p&
76、gt;<b> }</b></p><p><b> b.語(yǔ)法分析代碼:</b></p><p> int Bds::yufa_main()//語(yǔ)法分析主程序</p><p><b> {</b></p><p><b> int n;</b>
77、</p><p> cifa *p = new cifa;</p><p> strcpy(p -> word ,"#"); //對(duì)詞法分析產(chǎn)生的結(jié)果鏈表進(jìn)行處理</p><p> p -> type =-1;</p><p> p -> next = NULL;</p><
78、;p> cifa_add(p); </p><p> cifa_p = cifa_head;</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("算術(shù)表達(dá)式的遞歸分析過(guò)程如下:");</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("步驟 產(chǎn)生式
79、");</p><p> advance();</p><p><b> n = E();</b></p><p> if (n == 0) </p><p><b> {</b></p><p> CString report;</p>&
80、lt;p> report.Format("%2d 輸入串不是該文法的一個(gè)句子!",f);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("語(yǔ)法分析結(jié)束.");</p><p
81、> return (0);</p><p><b> }</b></p><p> else if (n == 1)</p><p><b> {</b></p><p> CString report;</p><p> report.Format(&qu
82、ot;%2d 輸入串是該文法的一個(gè)句子!",f);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("語(yǔ)法分析結(jié)束.");</p><p> return (1);</p>
83、<p><b> }</b></p><p><b> }</b></p><p> void Bds::advance()//取詞法分析產(chǎn)生列表中的結(jié)點(diǎn)作語(yǔ)法分析</p><p><b> {</b></p><p> cifa_p = cifa_p
84、 -> next;</p><p><b> }</b></p><p> int Bds::E()// E -> [+|-]TG 子函數(shù)</p><p><b> {</b></p><p><b> int t,g;</b></p>&l
85、t;p> if ((strcmp(cifa_p->word,"+") == 0)|| (strcmp(cifa_p->word,"-") == 0)) advance();</p><p> CString report;</p><p> report.Format("%2d E -> [+|-]TG
86、",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p><b> t = T();</b></p><p> if (t == 0) return (0);</p><p><b> g = G();</b&g
87、t;</p><p> if (g == 0) return (0);</p><p> else return (1);</p><p><b> }</b></p><p> int Bds::F()// F -> (E) | 標(biāo)識(shí)符 | 無(wú)符號(hào)整數(shù) 子函數(shù)</p><p>&
88、lt;b> {</b></p><p><b> int m;</b></p><p> if ((strcmp(cifa_p->word,"(") == 0 ) ) </p><p><b> {</b></p><p> CString re
89、port;</p><p> report.Format("%2d F -> (E)",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> advance();</p><p><b> m =E();</
90、b></p><p> if (m==0) return (0);</p><p> if ((strcmp(cifa_p->word,")") == 0 ) ) </p><p><b> {</b></p><p> advance();</p><p&g
91、t; return (1);</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("ERROR.&quo
92、t;);</p><p> return (0);</p><p><b> }</b></p><p><b> }</b></p><p> else if ( cifa_p->type == 1 || cifa_p->type == 2) //數(shù)字或是標(biāo)識(shí)符</p&g
93、t;<p><b> {</b></p><p> CString report;</p><p> report.Format("%2d F -> 標(biāo)識(shí)符|無(wú)符號(hào)整數(shù)",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);<
94、;/p><p> advance();</p><p> return (1);</p><p><b> }</b></p><p> else return 0;</p><p><b> }</b></p><p> int Bds::S
95、()// S -> *FS | /FS |ε 子函數(shù)</p><p><b> {</b></p><p><b> int t,g;</b></p><p> if (strcmp(cifa_p->word,"*") == 0) </p><p><b
96、> {</b></p><p> CString report;</p><p> report.Format("%2d S -> *FS",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> adva
97、nce();</p><p><b> t = F();</b></p><p> if (t== 0) return 0;</p><p><b> g = S();</b></p><p> if (g == 0) return 0;</p><p> retu
98、rn(1);</p><p><b> }</b></p><p> else if (strcmp(cifa_p->word,"/") == 0) </p><p><b> {</b></p><p> CString report;</p>&l
99、t;p> report.Format("%2d S -> /FS",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> advance();</p><p><b> t = F();</b></p>&
100、lt;p> if (t== 0) return 0;</p><p><b> g = S();</b></p><p> if (g == 0) return 0;</p><p> return(1);</p><p><b> }</b></p><p>
101、; else if (strcmp(cifa_p->word,"+") == 0 ||(strcmp(cifa_p->word,"-") == 0)||(strcmp(cifa_p->word,"#") == 0)||(strcmp(cifa_p->word,")") == 0)) </p><p><
102、b> {</b></p><p> CString report;</p><p> report.Format("%2d S -> ε",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> retur
103、n(1);</p><p><b> }</b></p><p> return (0);</p><p><b> }</b></p><p> int Bds::T()// T -> FS 子函數(shù)</p><p><b> {</b>
104、;</p><p><b> int t,g;</b></p><p> CString report;</p><p> report.Format("%2d T -> FS",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(re
105、port);</p><p><b> t = F();</b></p><p> if (t== 0) return 0;</p><p><b> g = S();</b></p><p> if (g == 0) return 0;</p><p> retu
106、rn(1);</p><p><b> }</b></p><p> int Bds::G()// G -〉+TG | -TG |ε子函數(shù)</p><p><b> {</b></p><p><b> int t,g;</b></p><p>
107、; if (strcmp(cifa_p->word,"+") == 0) </p><p><b> {</b></p><p> CString report;</p><p> report.Format("%2d G -> +TG",f++);</p>&l
108、t;p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> advance();</p><p><b> t=T();</b></p><p> if (t == 0) return(0);</p><p><b> g=G();</b
109、></p><p> if ( g== 0) return (0);</p><p> return (1);</p><p><b> }</b></p><p> else if (strcmp(cifa_p->word,"-") == 0) </p><p
110、><b> {</b></p><p> CString report;</p><p> report.Format("%2d G -> -TG",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p&
111、gt; advance();</p><p><b> t=T();</b></p><p> if (t == 0) return(0);</p><p><b> g=G();</b></p><p> if (g == 0) return (0);</p><p&
112、gt; return(1);</p><p><b> }</b></p><p> else if (strcmp(cifa_p->word,")") == 0 || strcmp(cifa_p->word,"#") == 0) </p><p><b> {</b&
113、gt;</p><p> CString report;</p><p> report.Format("%2d G -> ε",f++);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2(report);</p><p> return(1);</p>
114、<p><b> }</b></p><p> return (0);</p><p><b> } </b></p><p><b> c.語(yǔ)義分析代碼:</b></p><p> void Bds::yuyi_main()</p&g
115、t;<p><b> {</b></p><p> cifa_p = cifa_head;</p><p> yuyi_head = new yuyi;</p><p> yuyi_head -> next = NULL;</p><p> yuyi_end = yuyi_head;<
116、/p><p> ((CMATHDlg*)m_pWnd)->InfoAdd3("語(yǔ)義分析產(chǎn)生的四元式如下:");</p><p> advance();</p><p><b> E1();</b></p><p> yuyi_sys_disp();</p><p>
117、 ((CMATHDlg*)m_pWnd)->InfoAdd3("語(yǔ)義分析結(jié)束.");</p><p><b> }</b></p><p> yuyi *Bds::yuyi_add(yuyi *p)//在四元式鏈表末添加一個(gè)結(jié)點(diǎn)</p><p><b> {</b></p>
118、<p> yuyi_end->next = p ;</p><p> yuyi_end = p;</p><p> return yuyi_head;</p><p><b> }</b></p><p> void Bds::yuyi_sys_disp()//輸出四元式鏈表</p>
119、;<p><b> {</b></p><p><b> yuyi *p;</b></p><p> p = yuyi_head->next;</p><p> while(p!=NULL)</p><p><b> { </b></p&g
120、t;<p> CString report;</p><p> report.Format("(%c ,%s ,%s ,%s)",p->op,p->op1,p->op2,p->result);</p><p> ((CMATHDlg*)m_pWnd)->InfoAdd3(report);</p>&l
121、t;p> p = p->next;</p><p><b> }</b></p><p> //cout<<endl;</p><p><b> }</b></p><p> int Bds::E1()//E -> T+E | T-E | T</p&
122、gt;<p><b> { </b></p><p> yuyi *p = new yuyi;</p><p><b> T1(); </b></p><p> strcpy(p->op1,T_name);</p><p> if (strcmp(cifa_p-&g
123、t;word,"+") == 0) </p><p><b> {</b></p><p> advance();</p><p><b> E1();</b></p><p> p->next =NULL;</p><p> p->
124、op = '+';</p><p> strcpy(p->op2,E_name);</p><p> E_name[0] = 't';</p><p> E_name[1] = ++count;</p><p> E_name[2] = '\0';</p><p
125、> strcpy(p->result,E_name);</p><p> yuyi_add(p);</p><p> return (1);</p><p><b> }</b></p><p> else if (strcmp(cifa_p->word,"-") == 0
126、) </p><p><b> {</b></p><p> advance();</p><p><b> E1();</b></p><p> p->next =NULL;</p><p> p->op = '-';</p>
127、;<p> strcpy(p->op2,E_name);</p><p> E_name[0] = 't';</p><p> E_name[1] = ++count;</p><p> E_name[2] = '\0';</p><p> strcpy(p->result,
128、E_name);</p><p> yuyi_add(p);</p><p> return(1);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
129、<p> strcpy(E_name,T_name);</p><p> return(1);</p><p><b> }</b></p><p><b> }</b></p><p> int Bds::F1() //F -> (E) | 標(biāo)識(shí)符 | 無(wú)符號(hào)整數(shù)<
130、;/p><p><b> {</b></p><p> if ((strcmp(cifa_p->word,"(") == 0 ) ) </p><p><b> {</b></p><p> advance();</p><p> strcpy
131、(F_name,cifa_p->word);</p><p> strcpy(E_name,F_name); </p><p><b> E1();</b></p><p> if ((strcmp(cifa_p->word,")") == 0 ) ) </p><p><b
132、> {</b></p><p> advance();</p><p> strcpy(F_name,E_name);</p><p> return (1);</p><p><b> }</b></p><p><b> else </b>&
133、lt;/p><p><b> {</b></p><p> ((CMATHDlg*)m_pWnd)->InfoAdd2("ERROR.");</p><p> return (0);</p><p><b> }</b></p><p><
134、b> }</b></p><p> else if ( cifa_p->type == 1 || cifa_p->type == 2)</p><p><b> {</b></p><p> strcpy(F_name,cifa_p->word);</p><p> adva
135、nce();</p><p> return (1);</p><p><b> }</b></p><p> else return 0;</p><p><b> }</b></p><p> int Bds::T1()//T -> F*T | F/T
136、| F</p><p><b> {</b></p><p> yuyi *p = new yuyi;</p><p><b> F1();</b></p><p> strcpy(p->op1,F_name);</p><p> if (strcmp(cif
137、a_p->word,"*") == 0) </p><p><b> {</b></p><p> advance();</p><p><b> T1(); </b></p><p> p->next =NULL;</p><p>
138、 p->op = '*';</p><p> strcpy(p->op2,T_name);</p><p> T_name[0] = 't';</p><p> T_name[1] = ++count;</p><p> T_name[2] = '\0';</p>
139、<p> strcpy(p->result,T_name);</p><p> yuyi_add(p);</p><p> return(1);</p><p><b> }</b></p><p> else if (strcmp(cifa_p->word,"/"
140、) == 0) </p><p><b> {</b></p><p> advance();</p><p><b> T1();</b></p><p> p->next =NULL;</p><p> p->op = '/';<
141、;/p><p> strcpy(p->op2,T_name);</p><p> T_name[0] = 't';</p><p> T_name[1] = ++count;</p><p> T_name[2] = '\0';</p><p> strcpy(p->r
142、esult,T_name);</p><p> yuyi_add(p);</p><p> return(1);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p
143、><p> strcpy(T_name,F_name);</p><p> return(1);</p><p><b> }</b></p><p><b> }</b></p><p><b> 六、參考書(shū)目</b></p>&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì) (2)
- 編譯原理課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告-編譯程序構(gòu)造
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理遞歸下降子程序課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)詞法分析
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--詞法分析
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--- 編譯代碼生成器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告(一個(gè)完整的編譯器)
- 編譯原理課程設(shè)計(jì)報(bào)告--pl0編譯器的擴(kuò)充
評(píng)論
0/150
提交評(píng)論