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

下載本文檔

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

文檔簡介

1、<p>  福建農(nóng)林大學(xué)計算機與信息學(xué)院</p><p><b>  計算機類</b></p><p><b>  課程設(shè)計報告</b></p><p>  2011~2012學(xué)年第一學(xué)期</p><p> 課程名稱:編譯原理</p><p> 課程設(shè)計題目:語法分

2、析器</p><p> 姓 名:</p><p> 系:計算機</p><p> 專 業(yè):</p><p> 年 級:</p><p> 學(xué) 號:</p><p> 指導(dǎo)教師:</p><p>  福建農(nóng)林大學(xué)計算機與信息學(xué)院計算機類</p&

3、gt;<p><b>  課程設(shè)計結(jié)果評定</b></p><p>  目 錄</p><p>  1 正則表達(dá)式1</p><p>  1.1 正則表達(dá)式1</p><p>  1.2 確定化(化簡)后的狀態(tài)轉(zhuǎn)換圖1</p><p>  1.3 分析程序

4、代碼1</p><p>  1.4 程序運行截圖1</p><p><b>  1.5 小結(jié)1</b></p><p>  2 LL(1)分析2</p><p>  2.1 LL(1)文法2</p><p>  2.2 LL(1)預(yù)測分析表2</p><p&

5、gt;  2.3 分析程序代碼2</p><p>  2.4 程序運行截圖2</p><p><b>  2.5 小結(jié)2</b></p><p>  3 算符優(yōu)先分析3</p><p>  3.1 算符優(yōu)先文法3</p><p>  3.2 算符優(yōu)先關(guān)系表3</p&g

6、t;<p>  3.3 分析程序代碼3</p><p>  3.4 程序運行截圖3</p><p><b>  3.5 小結(jié)3</b></p><p><b>  4 LR分析4</b></p><p>  4.1 LR文法4</p><p>

7、;  4.2 LR分析表4</p><p>  4.3 分析程序代碼4</p><p>  4.4 程序運行截圖4</p><p><b>  4.5 小結(jié)4</b></p><p><b>  參考文獻(xiàn):4</b></p><p><b>  1

8、 正則表達(dá)式</b></p><p>  1.1 正則表達(dá)式</p><p>  (a|b)*(aa|bb)(a|b)* (注:該正規(guī)式為示例,可更改)</p><p>  1.2 確定化(化簡)后的狀態(tài)轉(zhuǎn)換圖</p><p>  1.3 分析程序代碼</p><p>  程序要求:用戶輸入一個符

9、號串,程序判斷是否為給定方法的句子。</p><p>  五號字,固定值12磅行間距。</p><p><b>  程序要有注釋</b></p><p>  #include <stdio.h></p><p>  #include <string.h></p><p> 

10、 #include <stdio.h></p><p>  #include <iostream></p><p>  #define STRM 5</p><p>  #define STRN 2</p><p>  class CodeParse</p><p><b>  {&l

11、t;/b></p><p><b>  public:</b></p><p>  void CodeParse::disPlayResult(int argc,char * argv[]);</p><p><b>  private:</b></p><p>  int analyzer(

12、char *words);</p><p><b>  };</b></p><p>  int CodeParse::analyzer(char *words)</p><p><b>  {</b></p><p>  int index=0,tab_pint=1;</p><

13、;p>  int map_table[STRM][STRN] = {{1,2},{2,3},{4,3},{2,4},{4,4}};</p><p>  while(words[index]!='\0')</p><p><b>  {</b></p><p>  if(words[index]=='a')&

14、lt;/p><p><b>  {</b></p><p>  tab_pint=map_table[tab_pint][0];</p><p><b>  }</b></p><p>  else if(words[index]=='b')</p><p>&l

15、t;b>  {</b></p><p>  tab_pint=map_table[tab_pint][1];</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>&

16、lt;p>  printf("Error of the input\n");</p><p><b>  return 0;</b></p><p><b>  } </b></p><p><b>  index++;</b></p><p><

17、;b>  }</b></p><p>  if (tab_pint==4) </p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p>&

18、lt;p><b>  }</b></p><p>  void CodeParse::disPlayResult(int argc,char * argv[])</p><p><b>  {</b></p><p>  if (analyzer(argv[1])>0)</p><p>

19、  std::cout<<"The str is right"<<std::endl;</p><p><b>  else</b></p><p>  std::cout<<"input ERROR"<<std::endl;</p><p><b&g

20、t;  }</b></p><p>  int main(int argc,char * argv[])</p><p><b>  {</b></p><p>  if(argc!=2)</p><p>  std::cout<<"The commond is error"&

21、lt;<std::endl;</p><p><b>  else</b></p><p><b>  {</b></p><p>  CodeParse codeParse;</p><p>  codeParse.disPlayResult(argc,argv);</p>&

22、lt;p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  1.4 程序運行截圖</p><p><b>  1.5 小結(jié):</b></p>&

23、lt;p>  2 LL(1)分析</p><p>  2.1 LL(1)文法</p><p>  E→TE' (注:該文法為示例,可更改)</p><p><b>  E'→+TE'|ε</b></p><p><b>  T→FT'</b><

24、/p><p><b>  T'→*FT'|ε</b></p><p><b>  F→(E)|i</b></p><p>  2.2 LL(1)預(yù)測分析表</p><p>  2.3 分析程序代碼</p><p>  程序要求:用戶輸入一個符號串,程序判斷是否

25、為給定方法的句子。</p><p>  五號字,固定值12磅行間距。</p><p><b>  程序要有注釋</b></p><p>  #include"stdio.h"</p><p>  #include"string.h"</p><p>  #d

26、efine maxsize 20</p><p>  #include"stdio.h"</p><p>  #include "string.h" </p><p>  //定義產(chǎn)生式結(jié)構(gòu)體</p><p>  struct production</p><p><b&g

27、t;  {</b></p><p>  char token;</p><p>  int tokens[6];</p><p><b>  };</b></p><p><b>  //定義堆棧結(jié)構(gòu)</b></p><p>  struct stack</

28、p><p><b>  {</b></p><p>  char stackwords[maxsize];</p><p>  int stack_top;</p><p><b>  };</b></p><p>  class LLOneParse</p>&l

29、t;p><b>  {</b></p><p><b>  public:</b></p><p>  void initial();</p><p>  int analyzer(char *words);</p><p><b>  private:</b></

30、p><p>  void push_stack(int num);</p><p>  int seekkeyword(char word);</p><p>  int seektoken(char word);</p><p><b>  private:</b></p><p>  struct

31、 production variable[5];</p><p>  struct stack astack;</p><p>  char produce[7][6];</p><p><b>  };</b></p><p>  void LLOneParse::initial()</p><

32、p><b>  {</b></p><p><b>  //初始化堆棧</b></p><p>  astack.stack_top=1;</p><p>  astack.stackwords[0]='#';</p><p>  astack.stackwords[1]=&#

33、39;E';</p><p><b>  //初始化產(chǎn)生式</b></p><p>  strcpy(produce[1],"DT");</p><p>  strcpy(produce[2],"DT+");</p><p>  strcpy(produce[3],&quo

34、t;HF");</p><p>  strcpy(produce[4],"HF*");</p><p>  strcpy(produce[5],")E(");</p><p>  strcpy(produce[6],"i");</p><p><b>  //初始

35、化二維表</b></p><p>  variable[0].token='E';</p><p>  variable[0].tokens[0]=1;</p><p>  variable[0].tokens[1]=-1;</p><p>  variable[0].tokens[2]=-1;</p>

36、<p>  variable[0].tokens[3]=1;</p><p>  variable[0].tokens[4]=-1;</p><p>  variable[0].tokens[5]=-1;</p><p>  variable[1].token='D';</p><p>  variable[1]

37、.tokens[0]=-1;</p><p>  variable[1].tokens[1]=2;</p><p>  variable[1].tokens[2]=-1;</p><p>  variable[1].tokens[3]=-1;</p><p>  variable[1].tokens[4]=0;</p><

38、p>  variable[1].tokens[5]=0;</p><p>  variable[2].token='T';</p><p>  variable[2].tokens[0]=3;</p><p>  variable[2].tokens[1]=-1;</p><p>  variable[2].tokens

39、[2]=-1;</p><p>  variable[2].tokens[3]=3;</p><p>  variable[2].tokens[4]=-1;</p><p>  variable[2].tokens[5]=-1;</p><p>  variable[3].token='H';</p><p

40、>  variable[3].tokens[0]=-1;</p><p>  variable[3].tokens[1]=0;</p><p>  variable[3].tokens[2]=4;</p><p>  variable[3].tokens[3]=-1;</p><p>  variable[3].tokens[4]=0;

41、</p><p>  variable[3].tokens[5]=0;</p><p>  variable[4].token='F';</p><p>  variable[4].tokens[0]=6;</p><p>  variable[4].tokens[1]=-1;</p><p>  va

42、riable[4].tokens[2]=-1;</p><p>  variable[4].tokens[3]=5;</p><p>  variable[4].tokens[4]=-1;</p><p>  variable[4].tokens[5]=-1;</p><p><b>  }</b></p>

43、<p><b>  //產(chǎn)生式進(jìn)棧</b></p><p>  void LLOneParse::push_stack(int num)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  if (num

44、!=0)</p><p><b>  {</b></p><p>  while(produce[num][i]!='\0')</p><p><b>  {</b></p><p>  astack.stack_top++;</p><p>  astack

45、.stackwords[astack.stack_top]=produce[num][i];</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b&

46、gt;</p><p>  int LLOneParse::seekkeyword(char word)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  for(i=0;i<5;i++)</p><p>

47、  if (word==variable[i].token)</p><p><b>  return i;</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int LLOneParse::seekto

48、ken(char word)</p><p><b>  {</b></p><p>  switch(word)</p><p><b>  {</b></p><p>  case 'i': return 0;</p><p>  case '+&

49、#39;:return 1;</p><p>  case '*': return 2;</p><p>  case '(': return 3;</p><p>  case ')': return 4;</p><p>  case '#':return 5;</p&

50、gt;<p>  default:return -1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int LLOneParse::analyzer(char *words)</p><p><b>  {</b&

51、gt;</p><p>  int index=0;//字符指針</p><p><b>  int i=0;</b></p><p>  int marki=-1;//標(biāo)記找到的字符</p><p>  int markj=-1;</p><p>  while(astack.stackwor

52、ds[astack.stack_top]!='#')</p><p><b>  {</b></p><p>  //堆棧指向終結(jié)符的情況</p><p>  if ( seektoken(astack.stackwords[astack.stack_top])!=-1)</p><p><b>

53、;  {</b></p><p>  if(seektoken(words[index])==seektoken(astack.stackwords[astack.stack_top]))</p><p><b>  {</b></p><p>  astack.stack_top--;</p><p>&

54、lt;b>  index++;</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  return 0;</b>&

55、lt;/p><p><b>  }</b></p><p>  marki=seekkeyword(astack.stackwords[astack.stack_top]);//尋找匹配變量</p><p>  markj=seektoken(words[index]);//尋找匹配字符</p><p>  //判斷表達(dá)式是

56、否有對應(yīng)的產(chǎn)生式</p><p>  if (markj!=-1)</p><p><b>  {</b></p><p>  if (variable[marki].tokens[markj]!=-1)</p><p><b>  { </b></p><p>  asta

57、ck.stack_top--;</p><p>  push_stack(variable[marki].tokens[markj]);//壓入堆棧</p><p><b>  }</b></p><p><b>  else</b></p><p>  return 0;</p>

58、<p><b>  }</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  if(words[index]=='#&#

59、39;)</p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  in

60、t main(int argc, char* argv[])</p><p><b>  {</b></p><p>  LLOneParse llOneParse;</p><p>  char userinput[maxsize];</p><p>  llOneParse.initial();//調(diào)用初始化函數(shù)&l

61、t;/p><p>  printf("請輸入字符串以#號結(jié)束:");</p><p>  scanf("%s",userinput);</p><p>  if (llOneParse.analyzer(userinput)>0)//調(diào)用程序</p><p>  printf("字符輸入合法

62、\n");</p><p><b>  else</b></p><p>  printf("非法輸入\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>

63、;  2.4 程序運行截圖</p><p><b>  2.5 小結(jié)</b></p><p><b>  3 算符優(yōu)先分析</b></p><p>  3.1 算符優(yōu)先文法</p><p>  E→T | E+T | E-T (注:該文法為示例,可更改)</p><p&

64、gt;  T→F | T*F | T/F</p><p><b>  F→(E) | i</b></p><p>  3.2 算符優(yōu)先關(guān)系表</p><p>  3.3 分析程序代碼</p><p>  程序要求:用戶輸入一個符號串,程序判斷是否為給定方法的句子。</p><p>  五號字,

65、固定值12磅行間距。</p><p><b>  程序要有注釋</b></p><p>  #include"stdio.h"</p><p>  #include"string.h"</p><p>  #define maxsize 20</p><p>

66、;  #include"stdio.h"</p><p>  #include "string.h" </p><p><b>  //定義堆棧結(jié)構(gòu)</b></p><p>  struct stack</p><p><b>  {</b></p>

67、;<p>  char stackwords[maxsize];</p><p>  int stack_top;</p><p><b>  };</b></p><p><b>  //定義二維關(guān)系表</b></p><p>  struct tokens</p>&

68、lt;p><b>  {</b></p><p>  char token;</p><p>  int relation[8];</p><p><b>  };</b></p><p>  class ProcessParse</p><p><b>  

69、{</b></p><p><b>  public:</b></p><p>  void initial();</p><p>  int analyzer(char *words);</p><p><b>  private:</b></p><p>  

70、int seektoken(char word);</p><p>  void pop_stack();</p><p><b>  private:</b></p><p>  struct stack astack;</p><p>  struct tokens atoken[8];</p><

71、;p><b>  };</b></p><p><b>  //初始化數(shù)據(jù)</b></p><p>  void ProcessParse::initial()</p><p><b>  {</b></p><p><b>  //初始化堆棧</b>

72、;</p><p>  astack.stack_top=0;</p><p>  astack.stackwords[0]='#';</p><p><b>  //初始化二維表</b></p><p>  atoken[0].token='+';</p><p>

73、;  atoken[0].relation[0]=2;</p><p>  atoken[0].relation[1]=2;</p><p>  atoken[0].relation[2]=1;</p><p>  atoken[0].relation[3]=1;</p><p>  atoken[0].relation[4]=1;</

74、p><p>  atoken[0].relation[5]=2;</p><p>  atoken[0].relation[6]=1;</p><p>  atoken[0].relation[7]=2;</p><p>  atoken[1].token='-';</p><p>  atoken[1].

75、relation[0]=2;</p><p>  atoken[1].relation[1]=2;</p><p>  atoken[1].relation[2]=1;</p><p>  atoken[1].relation[3]=1;</p><p>  atoken[1].relation[4]=1;</p><p&

76、gt;  atoken[1].relation[5]=2;</p><p>  atoken[1].relation[6]=1;</p><p>  atoken[1].relation[7]=2;</p><p>  atoken[2].token='*';</p><p>  atoken[2].relation[0]=2

77、;</p><p>  atoken[2].relation[1]=2;</p><p>  atoken[2].relation[2]=2;</p><p>  atoken[2].relation[3]=2;</p><p>  atoken[2].relation[4]=1;</p><p>  atoken[2

78、].relation[5]=2;</p><p>  atoken[2].relation[6]=1;</p><p>  atoken[2].relation[7]=2;</p><p>  atoken[3].token='/';</p><p>  atoken[3].relation[0]=2;</p>

79、<p>  atoken[3].relation[1]=2;</p><p>  atoken[3].relation[2]=2;</p><p>  atoken[3].relation[3]=2;</p><p>  atoken[3].relation[4]=1;</p><p>  atoken[3].relation[5]

80、=2;</p><p>  atoken[3].relation[6]=1;</p><p>  atoken[3].relation[7]=2;</p><p>  atoken[4].token='(';</p><p>  atoken[4].relation[0]=1;</p><p>  at

81、oken[4].relation[1]=1;</p><p>  atoken[4].relation[2]=1;</p><p>  atoken[4].relation[3]=1;</p><p>  atoken[4].relation[4]=1;</p><p>  atoken[4].relation[5]=0;</p>

82、<p>  atoken[4].relation[6]=1;</p><p>  atoken[4].relation[7]=2;</p><p>  atoken[5].token=')';</p><p>  atoken[5].relation[0]=2;</p><p>  atoken[5].relat

83、ion[1]=2;</p><p>  atoken[5].relation[2]=2;</p><p>  atoken[5].relation[3]=2;</p><p>  atoken[5].relation[4]=-1;</p><p>  atoken[5].relation[5]=2;</p><p> 

84、 atoken[5].relation[6]=-1;</p><p>  atoken[5].relation[7]=2;</p><p>  atoken[6].token='i';</p><p>  atoken[6].relation[0]=2;</p><p>  atoken[6].relation[1]=2;&l

85、t;/p><p>  atoken[6].relation[2]=2;</p><p>  atoken[6].relation[3]=2;</p><p>  atoken[6].relation[4]=-1;</p><p>  atoken[6].relation[5]=2;</p><p>  atoken[6].

86、relation[6]=-1;</p><p>  atoken[6].relation[7]=2;</p><p>  atoken[7].token='#';</p><p>  atoken[7].relation[0]=1;</p><p>  atoken[7].relation[1]=1;</p>&

87、lt;p>  atoken[7].relation[2]=1;</p><p>  atoken[7].relation[3]=1;</p><p>  atoken[7].relation[4]=1;</p><p>  atoken[7].relation[5]=1;</p><p>  atoken[7].relation[6]=

88、1;</p><p>  atoken[7].relation[7]=0;</p><p><b>  }</b></p><p>  int ProcessParse::seektoken(char word)</p><p><b>  {</b></p><p>  s

89、witch(word)</p><p><b>  {</b></p><p>  case '+':return 0;</p><p>  case '-': return 1;</p><p>  case '*': return 2;</p><p

90、>  case '/': return 3;</p><p>  case '(': return 4;</p><p>  case ')': return 5;</p><p>  case 'i': return 6;</p><p>  case '#

91、9;:return 7;</p><p>  default:return -1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void ProcessParse::pop_stack()</p><p><b&g

92、t;  {</b></p><p>  while(astack.stackwords[astack.stack_top]!='<')</p><p><b>  {</b></p><p>  astack.stack_top--;</p><p><b>  }</b

93、></p><p>  astack.stack_top--;</p><p><b>  }</b></p><p>  int ProcessParse::analyzer(char *words)</p><p><b>  {</b></p><p>  int

94、 index=0;//字符指針</p><p>  int marki=-1;//標(biāo)記找到的字符</p><p>  int markj=-1;</p><p>  while(words[index]!='#')</p><p><b>  {</b></p><p><b

95、>  //搜索二維表</b></p><p>  marki=seektoken(astack.stackwords[astack.stack_top]);</p><p>  markj=seektoken(words[index]);</p><p>  if(markj!=-1)//判斷字符是否在二維表內(nèi)</p><p&g

96、t;<b>  {</b></p><p>  if(atoken[marki].relation[markj]!=-1)</p><p><b>  {</b></p><p>  if(atoken[marki].relation[markj]!=2)</p><p><b>  {

97、</b></p><p>  //壓入堆棧并調(diào)整指針</p><p>  astack.stack_top++;</p><p>  if (atoken[marki].relation[markj]==1)</p><p>  astack.stackwords[astack.stack_top]='<';

98、</p><p><b>  else</b></p><p>  astack.stackwords[astack.stack_top]='=';</p><p>  astack.stack_top++;</p><p>  astack.stackwords[astack.stack_top]=wo

99、rds[index];</p><p><b>  index++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  pop_

100、stack();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>

101、;  }</b></p><p><b>  else</b></p><p>  return 0; </p><p><b>  }</b></p><p>  if (astack.stackwords[astack.stack_top]='#')//字符串是否滿足

102、要求</p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int

103、main(int argc, char* argv[])</p><p><b>  {</b></p><p>  ProcessParse processParse;</p><p>  char userinput[maxsize];</p><p>  processParse.initial();</p&

104、gt;<p>  printf("請輸入字符串以#號結(jié)束:");</p><p>  scanf("%s",userinput);</p><p>  if (processParse.analyzer(userinput)>0)//調(diào)用程序</p><p>  printf("字符輸入合法\n&

105、quot;);</p><p><b>  else</b></p><p>  printf("非法輸入\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  

106、3.4 程序運行截圖</p><p><b>  3.5 小結(jié)</b></p><p><b>  4 LR分析</b></p><p><b>  4.1 LR文法</b></p><p> ?。?)S'->S(注:該文法為示例,可更改)</p&g

107、t;<p><b> ?。?)S->BB</b></p><p><b> ?。?)B->aB</b></p><p><b> ?。?)B->b</b></p><p>  4.2 LR分析表</p><p>  4.3 分析程序代碼<

108、;/p><p>  程序要求:用戶輸入一個符號串,程序判斷是否為給定方法的句子。</p><p>  五號字,固定值12磅行間距。</p><p><b>  程序要有注釋</b></p><p>  #include"stdio.h"</p><p>  #include &qu

109、ot;string.h" </p><p>  #define maxsize 20</p><p><b>  //定義堆棧結(jié)構(gòu)</b></p><p>  struct state_stack</p><p><b>  {</b></p><p>  int

110、members[maxsize];</p><p>  int stack_top;</p><p><b>  };</b></p><p>  struct temp_stack</p><p><b>  {</b></p><p>  char members[max

111、size];</p><p>  int stack_top;</p><p><b>  };</b></p><p><b>  //定義二維關(guān)系表</b></p><p>  struct tokens</p><p><b>  {</b><

112、;/p><p><b>  bool ifR;</b></p><p>  int stat_num[5];</p><p><b>  };</b></p><p><b>  //產(chǎn)生式</b></p><p>  struct produce<

113、/p><p><b>  {</b></p><p>  int pro_num;</p><p>  char prod[3];</p><p>  char token;</p><p><b>  };</b></p><p>  class LLR

114、Parse</p><p><b>  {</b></p><p><b>  public:</b></p><p>  void initial();</p><p>  int seektoken(char word);</p><p>  int pop_stack(

115、int num);</p><p>  int analyzer(char *words);</p><p><b>  private:</b></p><p>  struct state_stack astack;</p><p>  struct temp_stack tstack;</p><

116、;p>  struct tokens atoken[7];</p><p>  struct produce aprod[3];</p><p><b>  };</b></p><p><b>  //定義全局變量</b></p><p><b>  //初始化數(shù)據(jù)</b&g

117、t;</p><p>  void LLRParse::initial()</p><p><b>  {</b></p><p><b>  //初始化堆棧</b></p><p>  astack.stack_top=0;</p><p>  astack.members

118、[0]=0;</p><p>  tstack.stack_top=0;</p><p>  tstack.members[0]='#';</p><p><b>  //初始化產(chǎn)生式</b></p><p>  aprod[0].pro_num=2;</p><p>  apro

119、d[0].token='S';</p><p>  strcpy(aprod[0].prod,"BB");</p><p>  aprod[1].pro_num=2;</p><p>  aprod[1].token='B';</p><p>  strcpy(aprod[1].prod,&

120、quot;Ba");</p><p>  aprod[2].pro_num=1;</p><p>  aprod[2].token='B';</p><p>  strcpy(aprod[2].prod,"b");</p><p><b>  //初始化二維表</b><

121、/p><p>  atoken[0].ifR=false;</p><p>  atoken[0].stat_num[0]=3;</p><p>  atoken[0].stat_num[1]=4;</p><p>  atoken[0].stat_num[2]=-1;</p><p>  atoken[0].stat_n

122、um[3]=1;</p><p>  atoken[0].stat_num[4]=2;</p><p>  atoken[1].ifR=false;</p><p>  atoken[1].stat_num[0]=-1;</p><p>  atoken[1].stat_num[1]=-1;</p><p>  ato

123、ken[1].stat_num[2]=100;</p><p>  atoken[1].stat_num[3]=-1;</p><p>  atoken[1].stat_num[4]=-1;</p><p>  atoken[2].ifR=false;</p><p>  atoken[2].stat_num[0]=3;</p>

124、<p>  atoken[2].stat_num[1]=4;</p><p>  atoken[2].stat_num[2]=-1;</p><p>  atoken[2].stat_num[3]=-1;</p><p>  atoken[2].stat_num[4]=5;</p><p>  atoken[3].ifR=fals

125、e;</p><p>  atoken[3].stat_num[0]=3;</p><p>  atoken[3].stat_num[1]=4;</p><p>  atoken[3].stat_num[2]=-1;</p><p>  atoken[3].stat_num[3]=-1;</p><p>  atoke

126、n[3].stat_num[4]=6;</p><p>  atoken[4].ifR=true;</p><p>  atoken[4].stat_num[0]=2;</p><p>  atoken[4].stat_num[1]=2;</p><p>  atoken[4].stat_num[2]=2;</p><p&

127、gt;  atoken[4].stat_num[3]=-1;</p><p>  atoken[4].stat_num[4]=-1;</p><p>  atoken[5].ifR=true;</p><p>  atoken[5].stat_num[0]=0;</p><p>  atoken[5].stat_num[1]=0;</p

128、><p>  atoken[5].stat_num[2]=0;</p><p>  atoken[5].stat_num[3]=-1;</p><p>  atoken[5].stat_num[4]=-1;</p><p>  atoken[6].ifR=true;</p><p>  atoken[6].stat_num

129、[0]=1;</p><p>  atoken[6].stat_num[1]=1;</p><p>  atoken[6].stat_num[2]=1;</p><p>  atoken[6].stat_num[3]=-1;</p><p>  atoken[6].stat_num[4]=-1;</p><p><

130、;b>  }</b></p><p>  int LLRParse::seektoken(char word)</p><p><b>  {</b></p><p>  switch(word)</p><p><b>  {</b></p><p>  

131、case 'a':return 0;</p><p>  case 'b': return 1;</p><p>  case '#': return 2;</p><p>  case 'S': return 3;</p><p>  case 'B': ret

132、urn 4;</p><p>  default:return -1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int LLRParse::pop_stack(int num)</p><p><b>  

133、{</b></p><p>  bool compare=true;</p><p><b>  int i=0;</b></p><p>  int temstate=0;</p><p>  /*for(i=0;i<aprod[num].pro_num;i++)</p><p&g

134、t;<b>  {</b></p><p>  if(tstack.members[tstack.stack_top-i]!=aprod[num].prod[i])</p><p><b>  false;</b></p><p><b>  }*/</b></p><p> 

135、 //判斷是否有歸約的字符串</p><p>  if (compare==true) </p><p><b>  {</b></p><p><b>  //指針向下跳轉(zhuǎn)</b></p><p>  astack.stack_top=astack.stack_top-aprod[num].pro

136、_num;</p><p>  tstack.stack_top=tstack.stack_top-aprod[num].pro_num;</p><p><b>  //壓入堆棧</b></p><p>  tstack.stack_top++;</p><p>  tstack.members[tstack.stac

137、k_top]=aprod[num].token;</p><p>  temstate=atoken[astack.members[astack.stack_top]].stat_num[seektoken(aprod[num].token)];</p><p>  if (temstate==-1)</p><p><b>  return 0;<

138、;/b></p><p>  astack.stack_top++;</p><p>  astack.members[astack.stack_top]=temstate;</p><p><b>  return 1;</b></p><p><b>  }</b></p>

139、<p><b>  else</b></p><p>  return 0;</p><p><b>  }</b></p><p>  int LLRParse::analyzer(char *words)</p><p><b>  {</b></p>

140、;<p>  int index=0;//字符指針</p><p>  int mark=0;//標(biāo)記找到的狀態(tài)</p><p>  int tempnum=0;</p><p>  while(astack.members[astack.stack_top]!=100)</p><p><b>  {</b&g

141、t;</p><p><b>  //搜索二維表</b></p><p>  mark=seektoken(words[index]);</p><p>  if (mark==-1)</p><p><b>  return 0;</b></p><p>  tempnum

142、=atoken[astack.members[astack.stack_top]].stat_num[mark];</p><p>  if(tempnum!=-1)//判斷字符是否在二維表內(nèi)</p><p><b>  {</b></p><p>  if(atoken[astack.members[astack.stack_top]].if

143、R==false)</p><p><b>  {</b></p><p>  astack.stack_top++;</p><p>  astack.members[astack.stack_top]=tempnum;</p><p>  tstack.stack_top++;</p><p>

144、;  tstack.members[tstack.stack_top]=words[index];</p><p><b>  index++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  

145、{</b></p><p>  if (pop_stack(tempnum)==0)</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

146、;<b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  return 1;</b></p><p><b>  }</b></p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論