2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩19頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論