編譯原理課程設(shè)計(jì)---c語(yǔ)言編譯器的實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  編譯原理課程設(shè)計(jì)</b></p><p>  學(xué) 號(hào): </p><p>  姓 名: </p><p>  專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  課 程: 編譯原理 &

2、lt;/p><p>  指導(dǎo)教師: </p><p><b>  目錄</b></p><p>  一.程序簡(jiǎn)介與分析---------------------------------------------------------3</p><p>  二.程序適用范圍------------------

3、-----------------------------------------3</p><p>  三.詞法分析---------------------------------------------------------------3</p><p>  四.語(yǔ)法分析--------------------------------------------------------

4、-------4</p><p>  五.語(yǔ)義分析和中間代碼生成------------------------------------------------10</p><p>  六.代碼生成--------------------------------------------------------------12</p><p>  七.流程圖-----

5、-----------------------------------------------------------13</p><p>  八.實(shí)現(xiàn)------------------------------------------------------------------14</p><p>  九.程序運(yùn)行結(jié)果---------------------------------

6、-------------------------14</p><p>  十.總結(jié)------------------------------------------------------------------18</p><p>  十一.附錄(源程序)--------------------------------------------------------18</p&

7、gt;<p><b>  簡(jiǎn)單的編譯程序設(shè)計(jì)</b></p><p><b>  程序簡(jiǎn)介與分析</b></p><p>  本程序由四個(gè)部分組成:詞法分析子程序,語(yǔ)法分析子程序,語(yǔ)義分析子程序,目標(biāo)代碼生成程序。本程序輸入一個(gè)叫l(wèi)ibo.txt的c語(yǔ)言源程序,然后對(duì)它進(jìn)行詞法,語(yǔ)法,語(yǔ)義分析,并輸出匯編代碼。</p>

8、<p>  詞法分析輸入的是c語(yǔ)言源程序,輸出的3是具有獨(dú)立語(yǔ)法意義的單詞符號(hào)。</p><p>  語(yǔ)法分析以詞法分析產(chǎn)生的編碼流為輸入,按照SLR(1)分析方法進(jìn)行語(yǔ)法分析,產(chǎn)生語(yǔ)法樹(shù),輸出移進(jìn)和歸約的動(dòng)作,如果源程序不符合文法,則有“語(yǔ)法分析出錯(cuò)”的提示。</p><p>  語(yǔ)義分析階段,在語(yǔ)法分析的同時(shí),在歸約的時(shí)候,給出相應(yīng)的語(yǔ)義動(dòng)作,最后輸出中間代碼四元式和新的符

9、號(hào)表,如果有未聲明的變量出現(xiàn),則會(huì)提示出出錯(cuò),并顯示出此變量的名稱(chēng)。</p><p>  代碼生成階段,將語(yǔ)義分析得到的中間代碼四元式轉(zhuǎn)化為匯編語(yǔ)言的目標(biāo)代碼并輸出。</p><p><b>  程序適用范圍</b></p><p>  本程序的使用范圍為:整型常量,四則運(yùn)算(為了簡(jiǎn)化問(wèn)題,本程序只考慮加法運(yùn)算和乘法運(yùn)算)和布爾表達(dá)式以及相應(yīng)的

10、賦值語(yǔ)句,條件轉(zhuǎn)移語(yǔ)句和循環(huán)語(yǔ)句。</p><p><b>  詞法分析</b></p><p>  根據(jù)詞法分析的需要,我將源程序中的單詞符號(hào)分為:保留字,字母(標(biāo)識(shí)符),</p><p>  界符三類(lèi),統(tǒng)一用一張表表示如下:</p><p><b>  界符,保留字表</b></p>

11、<p>  程序從源程序文件libo.txt中一次讀入一個(gè)字符,并判斷它是不是字母,界符,</p><p>  保留字,空格,換行,結(jié)束符號(hào)或者非法字符。</p><p><b>  流程圖如下:</b></p><p><b>  詞法分析流程圖</b></p><p><b&

12、gt;  語(yǔ)法分析</b></p><p> ?。闯绦蛑猩婕暗奈姆℅[P]定義如下表:</p><p>  .上述文法的每個(gè)非終結(jié)符的FIRST 集和FOLLOW集如下表:</p><p>  .文法G[P]的項(xiàng)目集部分如下:</p><p>  0. P’→.P 1. P’→P.</p><p

13、>  2. P→.id()L;R 3. P→id.()L;R 4. P→id(.)L;R </p><p>  5. P→id().L;R 6. P→id()L.;R 7. P→id()L;.R </p><p>  8. P→id()L;R. 9. L→.L;D</p><p>  10.L→L.;D

14、 11. L→L;.D 12. L→L;D. </p><p>  13.D→.id:int 14. D→id .:int 15. D→id: .int </p><p>  16. D→id:int. 17.E→.E+T 18. E→E.+T </p><p>  19.

15、 E→E+.T 20. E→E+T. 21. E→.T </p><p>  22. E→T. 23. T→.T*F 24. T→T.*F </p><p>  25. T→T*.F 26. T→T*F. 27. T→.F </p><p>  2

16、8. T→F. 29. F→ (E) 30. F→ (.E) </p><p>  31. F→ (E.) 32. F→ (E). 33. F→.id </p><p>  34. F→id. </p><p>  .再由項(xiàng)目集構(gòu)造文法的DFA活前綴。為了方便,省去了項(xiàng)目族集的每個(gè)

17、狀態(tài)的項(xiàng)目,直接在狀態(tài)轉(zhuǎn)換的箭頭上標(biāo)明終結(jié)符或非終結(jié)符。對(duì)于有規(guī)約動(dòng)作和接受的狀態(tài),將其特別標(biāo)明。文法G[P]的DFA圖如下:</p><p>  : int 說(shuō)明語(yǔ)句</p><p>  D id D id</p><p>  R ; L

18、 ) ( id P</p><p><b>  {</b></p><p>  if B then M</p><p>  id and id

19、 句法</p><p>  S id =</p><p>  } if id</p><p><b>  M N</b></p><p>  

20、; S id</p><p>  M while</p><p>  while B do M</p><p>  id and</p><p>  id

21、 B</p><p>  布爾表達(dá)式 > and</p><p><b>  id</b></p><p>  T id</p><p>  id

22、( F E</p><p>  * (</p><p>  F ( id</p><p>  F id +</p><p>  E ( 表達(dá)式</p><p><

23、b>  +</b></p><p>  ) T</p><p><b>  *</b></p><p>  語(yǔ)義分析和中間代碼生成</p><p>  載語(yǔ)法分析過(guò)程中,隨著分析的步步進(jìn)展,根據(jù)每個(gè)產(chǎn)生式所對(duì)應(yīng)的語(yǔ)義子程序(或語(yǔ)義規(guī)則描述的語(yǔ)義動(dòng)作)進(jìn)行

24、翻譯的辦法稱(chēng)作語(yǔ)法制導(dǎo)翻譯。</p><p><b>  語(yǔ)法制導(dǎo)翻譯</b></p><p>  語(yǔ)法翻譯生成的四元式如下:</p><p><b>  代碼生成</b></p><p>  目標(biāo)代碼生成階段的任務(wù)是把中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。這是編

25、譯的最后階段,它的工作與硬件系統(tǒng)結(jié)構(gòu)和指令含義有關(guān),這個(gè)階段的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運(yùn)用、機(jī)器指令的選擇、各種數(shù)據(jù)類(lèi)型變量的存儲(chǔ)空間分配以及寄存器和后緩寄存器的調(diào)度等。本程序生成的目標(biāo)代碼與0x8086微處理器兼容。</p><p>  下面列舉幾個(gè)簡(jiǎn)單的四元式與匯編代碼的轉(zhuǎn)化列子:</p><p> ?。?,A,B,T)→</p><p>  MO

26、V R ,A ;</p><p>  ADD R ,B ;</p><p>  ST R , T</p><p>  . ( *, A , B , T ) →</p><p>  MOV R ,A ;</p><p>  MUL R ,B ;</p><p>  ST R ,

27、 T</p><p>  . ( J, _ , _ , L) →</p><p><b>  JMP L</b></p><p>  . ( J> , A , B , L ) →</p><p>  MOV R , A</p><p>  CMP R , B</p>

28、<p><b>  JB L</b></p><p>  . ( =,A , _ ,T ) → </p><p><b>  LD R , A</b></p><p><b>  ST R , T</b></p><p>  本程序生成的目標(biāo)代碼如下: &

29、lt;/p><p><b>  程序流程圖</b></p><p><b>  編譯程序流程圖</b></p><p><b>  實(shí)現(xiàn)</b></p><p>  本程序運(yùn)行的硬件環(huán)境為CPU1.66HZ ,內(nèi)存為768M .軟件環(huán)境為windows xp</p>

30、<p>  系統(tǒng),Visual C++環(huán)境。</p><p><b>  程序運(yùn)行結(jié)果</b></p><p><b>  輸入源文件路徑:</b></p><p><b>  輸出保留字</b></p><p>  3.輸出符號(hào)表的內(nèi)容</p><

31、;p>  5.輸出語(yǔ)法分析的結(jié)果(本程序采用自下而上的LR語(yǔ)法分析)</p><p><b>  6.輸出中間代碼</b></p><p><b>  7.輸出目標(biāo)代碼</b></p><p><b>  總結(jié)</b></p><p>  通過(guò)本次實(shí)驗(yàn),我對(duì)編譯程序各階段

32、有了更深刻更深入的了解,也糾正了自己在某些方面的的錯(cuò)誤,豐富了自己關(guān)于編譯原理方面的知識(shí)。同時(shí)也培養(yǎng)了自己熱愛(ài)思考,勤查資料的習(xí)慣。由于水平本次實(shí)驗(yàn)涉及面并不是很全面,我只考慮了c語(yǔ)言的一個(gè)子集。當(dāng)然本程序的算法在某些地方也還存在一些缺陷。</p><p><b>  附錄(源程序)</b></p><p>  本程序輸入的c源代碼如下:</p><

33、;p><b>  libo()</b></p><p><b>  a:int;</b></p><p><b>  b:int;</b></p><p><b>  ccc:int;</b></p><p><b>  d:int;<

34、;/b></p><p><b>  {</b></p><p>  if ccc>b and ccc>a then a=b+a;</p><p>  while ccc>d do a=d;</p><p>  a=(b+ccc)*a+d</p><p><b>

35、  }</b></p><p>  本程序的完整源代碼如下:</p><p>  #include<cstdio></p><p>  #include<iostream></p><p>  #include<cstdlib></p><p>  #include<

36、;fstream></p><p>  #include<string></p><p>  #include<cmath></p><p>  using namespace std;</p><p>  struct token//詞法 token結(jié)構(gòu)體</p><p><b&g

37、t;  {</b></p><p>  int code;//編碼</p><p>  int num;//遞增編號(hào)</p><p>  token *next;</p><p><b>  };</b></p><p>  token *token_head,*token_tail;

38、//token隊(duì)列</p><p>  struct str//詞法 string結(jié)構(gòu)體</p><p><b>  {</b></p><p>  int num;//編號(hào)</p><p>  string word;//字符串內(nèi)容</p><p>  str *next;</p>

39、<p><b>  };</b></p><p>  str *string_head,*string_tail;//string隊(duì)列</p><p>  struct ivan//語(yǔ)法 產(chǎn)生式結(jié)構(gòu)體</p><p><b>  {</b></p><p>  char left;//

40、產(chǎn)生式的左部</p><p>  string right;//產(chǎn)生式的右部</p><p>  int len;//產(chǎn)生式右部的長(zhǎng)度</p><p><b>  };</b></p><p>  ivan css[20];//語(yǔ)法 20個(gè)產(chǎn)生式</p><p>  struct pank//語(yǔ)法

41、 action表結(jié)構(gòu)體</p><p><b>  {</b></p><p>  char sr;//移進(jìn)或歸約</p><p>  int state;//轉(zhuǎn)到的狀態(tài)編號(hào)</p><p><b>  };</b></p><p>  pank action[46][18]

42、;//action表</p><p>  int go_to[46][11];//語(yǔ)法 go_to表</p><p>  struct ike//語(yǔ)法 分析棧結(jié)構(gòu)體,雙鏈</p><p><b>  {</b></p><p><b>  ike *pre;</b></p><p

43、>  int num;//狀態(tài)</p><p>  int word;//符號(hào)編碼</p><p>  ike *next;</p><p><b>  };</b></p><p>  ike *stack_head,*stack_tail;//分析棧首尾指針</p><p>  stru

44、ct L//語(yǔ)義四元式的數(shù)據(jù)結(jié)構(gòu)</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  string op;//操作符</p><p>  string op1;//操作數(shù)</p><p>  string op2;//

45、操作數(shù)</p><p>  string result;//結(jié)果</p><p>  L *next;//語(yǔ)義四元式向后指針</p><p>  L *Ltrue;//回填true鏈向前指針</p><p>  L *Lfalse;//回填false鏈向前指針</p><p><b>  };</b&g

46、t;</p><p>  L *L_four_head,*L_four_tail,*L_true_head,*L_false_head;/*四元式鏈,true鏈,false鏈*/</p><p>  struct symb//語(yǔ)義輸入時(shí)符號(hào)表</p><p><b>  {</b></p><p>  string wo

47、rd;//變量名稱(chēng)</p><p>  int addr;//變量地址</p><p>  symb *next;</p><p><b>  };</b></p><p>  symb *symb_head,*symb_tail;//語(yǔ)義符號(hào)鏈表</p><p>  //////////////

48、//////////////////詞法分析有關(guān)函數(shù)聲明</p><p>  void outdaima() ;</p><p>  void scan();//按字符讀取源文件</p><p>  void cifa_main();//詞法分析主程序</p><p>  int judge(char ch);//判斷輸入字符的類(lèi)型</

49、p><p>  void out1(char ch);//寫(xiě)入token.txt</p><p>  void out3(char ch,string word);//寫(xiě)入string.txt</p><p>  void input1(token *temp);//插入結(jié)點(diǎn)到隊(duì)列token</p><p>  void input3(str *

50、temp);//插入結(jié)點(diǎn)到隊(duì)列string</p><p>  void output();//輸出三個(gè)隊(duì)列的內(nèi)容</p><p>  void outfile();//輸出三個(gè)隊(duì)列的內(nèi)容到相應(yīng)文件中</p><p>  ////////////////////////////////語(yǔ)法分析有關(guān)函數(shù)聲明</p><p>  void yuf

51、a_main();//語(yǔ)法分析主程序</p><p>  void yufa_initialize();//初始化語(yǔ)法分析數(shù)據(jù)結(jié)構(gòu)</p><p>  int yufa_SLR1(int a);//語(yǔ)法分析主體部分</p><p>  int ID1(int a);//給輸入字符編號(hào),轉(zhuǎn)化成action表列編號(hào)</p><p>  strin

52、g ID10(int i);//給輸入字符反編號(hào)</p><p>  int ID2(char ch);//給非終結(jié)狀態(tài)編號(hào),轉(zhuǎn)化成go_to表列編號(hào)</p><p>  int ID20(char ch);//給非終結(jié)狀態(tài)編號(hào)</p><p>  char ID21(int j);//給非終結(jié)狀態(tài)反編號(hào)</p><p>  void add

53、(ike *temp);//給ike分析棧鏈表增加一個(gè)結(jié)點(diǎn)</p><p>  void del();//給ike分析棧鏈表刪除一個(gè)結(jié)點(diǎn)</p><p>  /////////////////////////////////語(yǔ)義分析相關(guān)函數(shù)的聲明</p><p>  void yuyi_main(int m);//語(yǔ)義分析主程序</p><p&g

54、t;  void add_L_four(L *temp);//向四元式鏈中加一個(gè)結(jié)點(diǎn)</p><p>  void add_L_true(L *temp);//向true鏈中加一個(gè)結(jié)點(diǎn)</p><p>  void add_L_false(L *temp);//向false鏈中加一個(gè)結(jié)點(diǎn)</p><p>  void add_symb(symb *temp);//向

55、語(yǔ)義符號(hào)表鏈中加一個(gè)結(jié)點(diǎn)</p><p>  void output_yuyi();//輸出中間代碼四元式和最后符號(hào)表</p><p>  string newop(int m);//把數(shù)字變成字符串</p><p>  string id_numtoname(int num);//把編號(hào)轉(zhuǎn)換成相應(yīng)的變量名</p><p>  int loo

56、kup(string m);//變量聲明檢查</p><p>  /////////////////////////////////全局變量的聲明</p><p>  FILE *fp;//文件指針</p><p>  int wordcount;//標(biāo)志符計(jì)數(shù)</p><p>  int err;//標(biāo)志詞法分析結(jié)果正確或錯(cuò)誤</p&

57、gt;<p>  int nl;//讀取行數(shù)</p><p>  int yuyi_linshi;//語(yǔ)義臨時(shí)變量</p><p>  string E_name,T_name,F_name,M_name,id_name,id1_name,id2_name,errword;//用于歸約時(shí)名稱(chēng)傳遞和未聲明變量的輸出</p><p>  int id_nu

58、m,id1_num,id2_num,id_left,id_while,id_then,id_do;//用于記錄一些特殊的字符位置信息</p><p>  ////////////////////////////////主程序開(kāi)始</p><p>  int main()</p><p><b>  {</b></p><p&

59、gt;  cout<<"************************"<<endl;</p><p>  cout<<"* 說(shuō)明: *"<<endl;</p><p>  cout<<"* 第一部分:詞法分析 *"<<end

60、l;</p><p>  cout<<"* 第二部分:語(yǔ)法分析 *"<<endl;</p><p>  cout<<"* 第三部分:語(yǔ)義分析 *"<<endl;</p><p>  cout<<"* 第四部分:目標(biāo)代碼生成 *"<

61、<endl;</p><p>  cout<<"************************"<<endl;</p><p>  cifa_main();//詞法</p><p>  yufa_main();//語(yǔ)法</p><p>  output_yuyi();//語(yǔ)義</p&g

62、t;<p>  outdaima(); //代碼生成</p><p>  cout<<endl;</p><p>  system("pause");</p><p>  return(0);</p><p><b>  }</b></p><p> 

63、 //////////////////////////////////詞法分析子程序</p><p>  void cifa_main()</p><p><b>  {</b></p><p>  token_head=new token;</p><p>  token_head->next=NULL;<

64、/p><p>  token_tail=new token;</p><p>  token_tail->next=NULL;</p><p>  string_head=new str;</p><p>  string_head->next=NULL;</p><p>  string_tail=new s

65、tr;</p><p>  string_tail->next=NULL;//初始化三個(gè)隊(duì)列的首尾指針</p><p>  L_four_head=new L;</p><p>  L_four_head->next=NULL;</p><p>  L_four_tail=new L;</p><p>  

66、L_four_tail->k=0;</p><p>  L_four_tail->next=NULL;</p><p>  L_true_head=new L;</p><p>  L_true_head->Ltrue=NULL;</p><p>  L_false_head=new L;</p><p&

67、gt;  L_false_head->Lfalse=NULL;</p><p>  symb_head=new symb;</p><p>  symb_head->next=NULL;</p><p>  symb_tail=new symb;</p><p>  symb_tail->next=NULL;</p&g

68、t;<p>  yuyi_linshi=-1;</p><p><b>  id_num=0;</b></p><p>  wordcount=0;//初始化字符計(jì)數(shù)器</p><p>  err=0;//初始化詞法分析錯(cuò)誤標(biāo)志</p><p>  nl=1;//初始化讀取行數(shù)</p><

69、;p><b>  scan();</b></p><p>  if(err==0)</p><p><b>  {</b></p><p><b>  char m;</b></p><p><b>  output();</b></p>

70、<p>  cout<<"詞法分析正確完成!"<<endl<<endl<<"如果將結(jié)果保存到文件中請(qǐng)輸入 y ,否則請(qǐng)輸入其它字母:";</p><p><b>  cin>>m;</b></p><p>  cout<<endl;</p

71、><p>  if(m=='y')</p><p><b>  {</b></p><p>  outfile();</p><p>  cout<<"結(jié)果成功保存在token.txt和sting.txt兩個(gè)文件中,請(qǐng)打開(kāi)查看"<<endl;</p>

72、<p>  cout<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void scan()</p><p><b>

73、;  {</b></p><p>  cout<<endl;</p><p>  system("pause");</p><p>  cout<<endl;</p><p><b>  char ch;</b></p><p>  stri

74、ng word;</p><p>  char document[50];</p><p>  int flag=0;</p><p>  cout<<"請(qǐng)輸入源文件路徑及名稱(chēng):";</p><p>  cin>>document;</p><p>  cout<<

75、;endl;</p><p>  cout<<"************************"<<endl;</p><p>  cout<<"* 第一部分:詞法分析 *"<<endl;</p><p>  cout<<"**************

76、**********"<<endl;</p><p>  if((fp=fopen(document,"rt"))==NULL)</p><p><b>  {</b></p><p><b>  err=1;</b></p><p>  cout<&

77、lt;"無(wú)法找到該文件!"<<endl;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  while(!feof(fp))</p><p><b>  {</b></p>

78、<p><b>  word="";</b></p><p>  ch=fgetc(fp);</p><p>  flag=judge(ch);</p><p>  if(flag==1)</p><p><b>  out1(ch);</b></p>

79、<p>  else if(flag==3)</p><p>  out3(ch,word);</p><p>  else if(flag==4 || flag==5 ||flag==6)</p><p><b>  continue;</b></p><p><b>  else</b&g

80、t;</p><p><b>  {</b></p><p>  cout<<nl<<"行 "<<"錯(cuò)誤:非法字符! "<<ch<<endl;</p><p><b>  err=1;</b></p>&l

81、t;p><b>  }</b></p><p><b>  }</b></p><p>  fclose(fp);</p><p><b>  }</b></p><p>  int judge(char ch)</p><p><b>

82、  {</b></p><p>  int flag=0;</p><p>  if(ch=='=' || ch=='+' || ch=='*' || ch=='>' || ch==':' || ch==';' || ch=='{' || ch=='}&

83、#39; || ch=='(' || ch==')')</p><p>  flag=1;//界符</p><p>  else if(('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z'))</p&

84、gt;<p>  flag=3;//字母</p><p>  else if(ch==' ')</p><p>  flag=4;//空格</p><p>  else if(feof(fp))</p><p>  flag=5;//結(jié)束</p><p>  else if(ch==

85、9;\n')</p><p><b>  {</b></p><p>  flag=6;//換行</p><p><b>  nl++;</b></p><p><b>  }</b></p><p><b>  else</b&

86、gt;</p><p>  flag=0;//非法字符</p><p>  return(flag);</p><p><b>  }</b></p><p>  void out1(char ch)</p><p><b>  {</b></p><p&

87、gt;<b>  int id;</b></p><p>  switch(ch)</p><p><b>  {</b></p><p>  case '=' : id=1;break;</p><p>  case '+' : id=2;break;</p&

88、gt;<p>  case '*' : id=3;break;</p><p>  case '>' : id=4;break;</p><p>  case ':' : id=5;break;</p><p>  case ';' : id=6;break;</p>

89、<p>  case '{' : id=7;break;</p><p>  case '}' : id=8;break;</p><p>  case '(' : id=9;break;</p><p>  case ')' : id=10;break;//界符編碼</p>&

90、lt;p>  default : id=0;</p><p><b>  }</b></p><p>  token *temp;</p><p>  temp=new token;</p><p>  temp->code=id;</p><p>  temp->num=-1;

91、</p><p>  temp->next=NULL;</p><p>  input1(temp);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  void out3(char ch,string wo

92、rd)</p><p><b>  {</b></p><p>  token *temp;</p><p>  temp=new token;</p><p>  temp->code=-1;</p><p>  temp->num=-1;</p><p> 

93、 temp->next=NULL;</p><p>  str *temp1;</p><p>  temp1=new str;</p><p>  temp1->num=-1;</p><p>  temp1->word="";</p><p>  temp1->next=

94、NULL;</p><p>  int flag=0;</p><p>  word=word+ch;</p><p>  ch=fgetc(fp);</p><p>  flag=judge(ch);</p><p>  if(flag==1 || flag==4 || flag==5 || flag==6)<

95、/p><p><b>  {</b></p><p>  if(word=="and" || word=="if" || word=="then" || word=="while" || word=="do" || word=="int")</p&

96、gt;<p><b>  {</b></p><p>  if(word=="and")</p><p>  temp->code=31;</p><p>  else if(word=="if")</p><p>  temp->code=32;<

97、/p><p>  else if(word=="then")</p><p>  temp->code=33;</p><p>  else if(word=="while")</p><p>  temp->code=35;</p><p>  else if(word

98、=="do")</p><p>  temp->code=36;</p><p>  else if(word=="int")</p><p>  temp->code=37;//關(guān)鍵字編碼</p><p>  input1(temp);</p><p>  if(f

99、lag==1)</p><p><b>  out1(ch);</b></p><p>  else if(flag==4 || flag==5 || flag==6)</p><p><b>  return;</b></p><p><b>  }</b></p>

100、;<p>  else if(flag==1)</p><p><b>  {</b></p><p>  wordcount++;</p><p>  temp->code=25;</p><p>  temp->num=wordcount;</p><p>  inp

101、ut1(temp);</p><p>  temp1->num=wordcount;</p><p>  temp1->word=word;</p><p>  input3(temp1);</p><p><b>  out1(ch);</b></p><p><b>  

102、}</b></p><p>  else if(flag==4 || flag==5 || flag==6)</p><p><b>  {</b></p><p>  wordcount++;</p><p>  temp->code=25;</p><p>  temp-&g

103、t;num=wordcount;</p><p>  input1(temp);</p><p>  temp1->num=wordcount;</p><p>  temp1->word=word;</p><p>  input3(temp1);</p><p><b>  }</b&g

104、t;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  else if(flag==2 || flag==3)</p><p>  out3(ch,word);//形成字符串</p><p><b>  

105、else</b></p><p><b>  {</b></p><p><b>  err=1;</b></p><p>  cout<<nl<<"行 "<<"錯(cuò)誤:非法字符! "<<ch<<endl;&l

106、t;/p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void input1(token *temp)</p><p><b>  {</b&

107、gt;</p><p>  if(token_head->next == NULL)</p><p><b>  {</b></p><p>  token_head->next=temp;</p><p>  token_tail->next=temp;</p><p><

108、;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  token_tail->next->next=temp;</p><p>  token_tail->next=temp;</p&

109、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  void input3(str *temp)</p><p><b>  {</b></p><p>  if(string_head->next == NUL

110、L)</p><p><b>  {</b></p><p>  string_head->next=temp;</p><p>  string_tail->next=temp;</p><p><b>  }</b></p><p><b>  el

111、se</b></p><p><b>  {</b></p><p>  string_tail->next->next=temp;</p><p>  string_tail->next=temp;</p><p><b>  }</b></p><

112、;p><b>  }</b></p><p>  void output()</p><p><b>  {</b></p><p>  cout<<"token表內(nèi)容如下:"<<endl;</p><p>  token *temp1;</p

113、><p>  temp1=new token;</p><p>  temp1=token_head->next;</p><p>  while(temp1!=NULL)</p><p><b>  {</b></p><p>  cout<<temp1->code;<

114、/p><p>  if(temp1->num == -1)</p><p><b>  {</b></p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  else</b></p

115、><p><b>  {</b></p><p>  cout<<" "<<temp1->num<<endl;</p><p><b>  }</b></p><p>  temp1=temp1->next;</p>

116、<p><b>  }</b></p><p>  cout<<"符號(hào)表內(nèi)容如下:"<<endl;</p><p>  str *temp3;</p><p>  temp3=new str;</p><p>  temp3=string_head->next;

117、</p><p>  while(temp3!=NULL)</p><p><b>  {</b></p><p>  cout<<temp3->num<<" "<<temp3->word<<endl;</p><p>  temp3=t

118、emp3->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void outfile()</p><p><b>  {</b></p><p>  ofstream fout1(&q

119、uot;token.txt");//寫(xiě)文件</p><p>  ofstream fout3("string.txt");</p><p>  token *temp1;</p><p>  temp1=new token;</p><p>  temp1=token_head->next;</p&g

120、t;<p>  while(temp1!=NULL)</p><p><b>  {</b></p><p>  fout1<<temp1->code;</p><p>  if(temp1->num == -1)</p><p>  fout1<<endl;</p

121、><p><b>  else</b></p><p>  fout1<<" "<<temp1->num<<endl;</p><p>  temp1=temp1->next;</p><p><b>  }</b></p&g

122、t;<p>  str *temp3;</p><p>  temp3=new str;</p><p>  temp3=string_head->next;</p><p>  while(temp3!=NULL)</p><p><b>  {</b></p><p>  

123、fout3<<temp3->num<<" "<<temp3->word<<endl;</p><p>  temp3=temp3->next;</p><p><b>  }</b></p><p><b>  }</b></p

124、><p>  /////////////////////////////////////////語(yǔ)法分析子程序</p><p>  void yufa_main()</p><p><b>  {</b></p><p>  if(err==0)</p><p><b>  {</b&

125、gt;</p><p>  system("pause");</p><p>  cout<<endl;</p><p>  cout<<"************************"<<endl;</p><p>  cout<<"*

126、第二部分:語(yǔ)法分析 *"<<endl;</p><p>  cout<<"************************"<<endl;</p><p>  yufa_initialize();//初始化語(yǔ)法分析數(shù)據(jù)結(jié)構(gòu)</p><p>  token *temp;</p><

127、p>  temp=new token;</p><p>  temp=token_head->next;</p><p><b>  int p,q;</b></p><p><b>  p=0;</b></p><p><b>  q=0;</b></p&g

128、t;<p>  cout<<"語(yǔ)法分析過(guò)程如下:"<<endl;</p><p>  while(temp!=NULL)</p><p><b>  {</b></p><p><b>  int w;</b></p><p>  w=ID1

129、(temp->code);</p><p>  p=yufa_SLR1(w);</p><p>  if(p==1) break;</p><p><b>  if(p==0)</b></p><p>  temp=temp->next;</p><p>  if(temp==NULL

130、) q=1;</p><p><b>  }//語(yǔ)法分析</b></p><p><b>  if(q==1)</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p> 

131、 p=yufa_SLR1(17);</p><p>  if(p==3) break;</p><p>  }//最后輸入$來(lái)完成語(yǔ)法分析</p><p><b>  }</b></p><p><b>  }</b></p><p>  void yufa_initiali

132、ze()</p><p><b>  {</b></p><p>  stack_head=new ike;</p><p>  stack_tail=new ike;</p><p>  stack_head->pre=NULL;</p><p>  stack_head->nex

133、t=stack_tail;</p><p>  stack_head->num=0;</p><p>  stack_head->word='!';</p><p>  stack_tail->pre=stack_head;</p><p>  stack_tail->next=NULL;//初始化棧分

134、析鏈表</p><p>  css[0].left='Q';</p><p>  css[0].right="P";</p><p>  css[1].left='P';</p><p>  css[1].right="id()L;R";</p><p

135、>  css[2].left='L';</p><p>  css[2].right="L;D";</p><p>  css[3].left='L';</p><p>  css[3].right="D";</p><p>  css[4].left='D

136、';</p><p>  css[4].right="id:int";</p><p>  css[5].left='E';</p><p>  css[5].right="E+T";</p><p>  css[6].left='E';</p>&

137、lt;p>  css[6].right="T";</p><p>  css[7].left='T';</p><p>  css[7].right="T*F";</p><p>  css[8].left='T';</p><p>  css[8].right=&

138、quot;F";</p><p>  css[9].left='F';</p><p>  css[9].right="(E)";</p><p>  css[10].left='F';</p><p>  css[10].right="id";</p&g

139、t;<p>  css[11].left='B';</p><p>  css[11].right="B and B";</p><p>  css[12].left='B';</p><p>  css[12].right="id>id";</p><p

140、>  css[13].left='M';</p><p>  css[13].right="id=E";</p><p>  css[14].left='S';</p><p>  css[14].right="if B then M";</p><p>  css

141、[15].left='S';</p><p>  css[15].right="while B do M";</p><p>  css[16].left='S';</p><p>  css[16].right="M";</p><p>  css[17].left=&

142、#39;N';</p><p>  css[17].right="N;S";</p><p>  css[18].left='N';</p><p>  css[18].right="S";</p><p>  css[19].left='R';</p>

143、;<p>  css[19].right="{N}";</p><p><b>  int i,j;</b></p><p>  for(i=0;i<20;i++)</p><p><b>  {</b></p><p>  char *css_len;<

144、;/p><p>  css_len=&css[i].right[0];</p><p>  css[i].len=strlen(css_len);</p><p><b>  }</b></p><p>  css[1].len=6;</p><p>  css[4].len=3;</p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論