2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩24頁(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>  課程名稱 編譯原理 </p><p>  設(shè)計(jì)題目 遞歸下降語(yǔ)法分析 </p><p><b>  設(shè)計(jì)目的</b></p><p>  通過(guò)設(shè)計(jì)、編制、調(diào)試一個(gè)具體的語(yǔ)法分析程序,加深對(duì)語(yǔ)法分析原理的理解,加深對(duì)語(yǔ)法及語(yǔ)義分析原理的理解,并實(shí)現(xiàn)對(duì)文法的判斷,是算符優(yōu)先文法的對(duì)

2、其進(jìn)行FirstVT集及LastVT集的分析,并對(duì)輸入的字符串進(jìn)行規(guī)約輸出規(guī)約結(jié)果成功或失敗。</p><p><b>  設(shè)計(jì)內(nèi)容及步驟</b></p><p>  內(nèi)容:在C++ 6.0中編寫(xiě)程序代碼實(shí)現(xiàn)語(yǔ)法分析功能,調(diào)試得到相應(yīng)文法的判斷結(jié)果:是算符優(yōu)先或不是。若是,則輸出各非終結(jié)符的FirstVT與LastVT集的結(jié)果,還可進(jìn)行字符串的規(guī)約,輸出詳細(xì)的規(guī)約步驟

3、,程序自動(dòng)判別規(guī)約成功與失敗。</p><p>  步驟:1.看書(shū),找資料,了解語(yǔ)法分析器的工作過(guò)程與原理</p><p>  2.分析題目,列出基本的設(shè)計(jì)思路</p><p>  定義棧,進(jìn)棧,出棧函數(shù)</p><p><b>  棧為空時(shí)的處理</b></p><p>  構(gòu)造函數(shù)判斷文法是否

4、是算符文法,算符優(yōu)先文法</p><p>  構(gòu)造FirstVT和LastVT函數(shù)對(duì)文法的非終結(jié)符進(jìn)行分析</p><p>  是算符優(yōu)先文法時(shí),構(gòu)造函數(shù)對(duì)其可以進(jìn)行輸入待規(guī)約串,輸出規(guī)約結(jié)果</p><p>  構(gòu)造主函數(shù),對(duì)過(guò)程進(jìn)行分析</p><p>  3.上機(jī)實(shí)踐編碼,將設(shè)計(jì)的思路轉(zhuǎn)換成C++語(yǔ)言編碼,編譯運(yùn)行</p>

5、<p>  4.測(cè)試,輸入不同的文法,觀察運(yùn)行結(jié)果</p><p><b>  詳細(xì)的算法描述</b></p><p>  詳細(xì)設(shè)計(jì)偽代碼如下:</p><p>  首先要聲明變量,然后定義各個(gè)函數(shù)</p><p>  1.void Initstack(charstack &s)</p>

6、<p><b>  {//定義棧</b></p><p>  s.base=new charLode[20];</p><p>  s.top=-1; }</p><p>  2. void push(charstack &s,charLode w)</p><p><b>  {//字符進(jìn)

7、棧</b></p><p><b>  s.top++;</b></p><p>  s.base[s.top].E=w.E;</p><p>  s.base[s.top].e=w.e;</p><p><b>  }</b></p><p>  3. void

8、 pop(charstack &s,charLode &w)</p><p><b>  {//字符出棧</b></p><p>  w.E=s.base[s.top].E;</p><p>  w.e=s.base[s.top].e;</p><p><b>  s.top--;</b&

9、gt;</p><p><b>  }</b></p><p>  4. int IsEmpty(charstack s)</p><p>  {//判斷棧是否為空</p><p>  if(s.top==-1)</p><p><b>  return 1;</b><

10、/p><p>  else return 0;</p><p><b>  }</b></p><p>  5.int IsLetter(char ch)</p><p>  {//判斷是否為非終結(jié)符</p><p>  if(ch>='A'&&ch<=&#

11、39;Z')</p><p><b>  return 1;</b></p><p>  else return 0;</p><p><b>  }</b></p><p>  6.int judge1(int n)</p><p>  { //judge1是判斷是

12、否是算符文法:若產(chǎn)生式中含有兩個(gè)相繼的非終結(jié)符則不是算符文法</p><p><b>  }</b></p><p>  7. void judge2(int n)</p><p>  {//judge2是判斷文法G是否為算符優(yōu)先文法:若不是算符文法或若文法中含空字或終結(jié)符的優(yōu)先級(jí)不唯一則不是算符優(yōu)先文法</p><p>

13、;  8.int search1(char r[],int kk,char a)</p><p>  { //search1是查看存放終結(jié)符的數(shù)組r中是否含有重復(fù)的終結(jié)符}</p><p>  9.void createF(int n)</p><p>  { //createF函數(shù)是用F數(shù)組存放每個(gè)終結(jié)符與非終結(jié)符和組合,并且值每隊(duì)的標(biāo)志位為0;F數(shù)組是一個(gè)結(jié)構(gòu)體

14、}</p><p>  10.void search(charLode w)</p><p>  { //search函數(shù)是將在F數(shù)組中尋找到的終結(jié)符與非終結(jié)符對(duì)的標(biāo)志位值為1 }</p><p>  分情況討論://產(chǎn)生式的后選式的第一個(gè)字符就是終結(jié)符的情況</p><p>  //產(chǎn)生式的后選式的第一個(gè)字符是非終結(jié)符的情況</p&g

15、t;<p>  11.void LastVT(int n) </p><p>  {//求LastVT</p><p><b>  }</b></p><p>  12.void FirstVT(int n) </p><p>  {//求FirstVT</p><p><b&

16、gt;  }</b></p><p>  13.void createYXB(int n)</p><p><b>  {//構(gòu)造優(yōu)先表</b></p><p>  分情況討論://優(yōu)先級(jí)等于的情況,用1值表示等于}</p><p>  //優(yōu)先級(jí)小于的情況,用2值表示小于</p><p&

17、gt;  //優(yōu)先級(jí)大于的情況,用3值表示大于</p><p><b>  }</b></p><p>  14.int judge3(char s,char a)</p><p>  {//judge3是用來(lái)返回在歸約過(guò)程中兩個(gè)非終結(jié)符相比較的值</p><p><b>  }</b></p

18、><p>  15.void print(char s[],char STR[][20],int q,int u,int ii,int k)</p><p>  {//打印歸約的過(guò)程}</p><p>  16. void process(char STR[][20],int ii)</p><p>  {//對(duì)輸入的字符串進(jìn)行歸約的過(guò)程<

19、/p><p><b>  }</b></p><p><b>  設(shè)計(jì)結(jié)果</b></p><p>  分兩大類(lèi),四種不同的情況</p><p>  第一類(lèi)情況:產(chǎn)生式的候選式以終結(jié)符開(kāi)始候選式以終結(jié)符開(kāi)始經(jīng)過(guò)存在遞歸式的非終結(jié)符后再以終結(jié)符結(jié)束</p><p>  第二類(lèi)情況:

20、產(chǎn)生式的候選式是兩個(gè)或以上的非終結(jié)符</p><p><b>  五、設(shè)計(jì)總結(jié)與心得</b></p><p>  通過(guò)對(duì)語(yǔ)法分析的實(shí)踐操作,對(duì)它在實(shí)踐中的應(yīng)用有了更深刻的理解,通過(guò)上機(jī)實(shí)踐,提高了從錯(cuò)誤中分析問(wèn)題,解決問(wèn)題的能力。在實(shí)踐的基礎(chǔ)上,把所學(xué)的知識(shí)得到了實(shí)際應(yīng)用,通過(guò)本次的編譯原理課程設(shè)計(jì),讓我對(duì)用C++編程的大致思路又進(jìn)行了一次回顧,設(shè)計(jì)一個(gè)可運(yùn)行的程序代

21、碼的思路規(guī)范,聲明變量,定義各大需要調(diào)用的函數(shù)及其調(diào)用。</p><p>  在這個(gè)實(shí)驗(yàn)的過(guò)程中,如何運(yùn)用棧,指針來(lái)達(dá)到判斷是否是算符優(yōu)先文法的規(guī)約的目的,當(dāng)然其中也設(shè)計(jì)了多個(gè)供調(diào)用的函數(shù),聲明了多個(gè)變量,鍛煉了思維邏輯能力,同時(shí)在和同學(xué)的探討下鍛煉了我的發(fā)現(xiàn)問(wèn)題分析問(wèn)題的能力。</p><p><b>  六、程序完整代碼</b></p><p&

22、gt;  #include<iostream.h></p><p>  #include<string.h></p><p>  #include<stdio.h></p><p>  typedef struct</p><p><b>  {</b></p><

23、p><b>  char R;</b></p><p><b>  char r;</b></p><p><b>  int flag;</b></p><p><b>  }array;</b></p><p>  typedef struct

24、</p><p><b>  {</b></p><p><b>  char E;</b></p><p><b>  char e;</b></p><p>  }charLode;</p><p>  typedef struct</p>

25、;<p><b>  {</b></p><p>  charLode *base;</p><p><b>  int top;</b></p><p>  }charstack;</p><p>  char str[80][80],arr[80][80],brr[80][80];

26、</p><p>  array F[20];</p><p>  int m,kk,p,ppp,FF=1;</p><p>  char r[10];</p><p>  int crr[20][20],FLAG=0;</p><p>  char ccrr1[1][20],ccrr2[20][1];</p&g

27、t;<p>  void Initstack(charstack &s){</p><p>  s.base=new charLode[20];</p><p><b>  s.top=-1;</b></p><p><b>  }</b></p><p>  void pus

28、h(charstack &s,charLode w)</p><p><b>  {</b></p><p><b>  s.top++;</b></p><p>  s.base[s.top].E=w.E;</p><p>  s.base[s.top].e=w.e;</p>

29、<p><b>  }</b></p><p>  void pop(charstack &s,charLode &w)</p><p><b>  {</b></p><p>  w.E=s.base[s.top].E;</p><p>  w.e=s.base[s.t

30、op].e;</p><p><b>  s.top--;</b></p><p><b>  }</b></p><p>  int IsEmpty(charstack s)</p><p><b>  {</b></p><p>  if(s.top

31、==-1)</p><p><b>  return 1;</b></p><p>  else return 0;</p><p><b>  }</b></p><p>  int IsLetter(char ch)</p><p><b>  {</b&

32、gt;</p><p>  if(ch>='A'&&ch<='Z')</p><p><b>  return 1;</b></p><p>  else return 0;</p><p><b>  }</b></p>&

33、lt;p>  int judge1(int n)</p><p><b>  {</b></p><p>  int j=3,flag=0;</p><p>  for(int i=0;i<=n;i++)</p><p>  while(str[i][j]!='\0')</p>

34、<p><b>  {</b></p><p>  char a=str[i][j];</p><p>  char b=str[i][j+1];</p><p>  if(IsLetter(a)&&IsLetter(b))</p><p>  {flag=1;break;}</p>

35、<p><b>  else j++;</b></p><p><b>  }</b></p><p>  if(flag==1)</p><p><b>  return 0;</b></p><p><b>  else</b></

36、p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  void judge2(int n)</p><p><b>  {</b></p><p>  for(int i=0;i<=n;i++)

37、</p><p>  if(str[i][3]=='~'||judge1(n)==0||FLAG==1)//'~'代表空字</p><p>  {cout<<"文法G不是算符優(yōu)先文法!"<<endl;FF=0;break;}</p><p><b>  if(i>n)<

38、/b></p><p>  cout<<"文法G是算符優(yōu)先文法!"<<endl;</p><p><b>  }</b></p><p>  int search1(char r[],int kk,char a)</p><p><b>  {</b>

39、;</p><p>  for(int i=0;i<kk;i++)</p><p>  if(r[i]==a)</p><p><b>  break;</b></p><p>  if(i==kk) return 0;</p><p>  else return 1;</p>

40、<p><b>  }</b></p><p>  void createF(int n)</p><p><b>  {</b></p><p>  int k=0,i=1;char g;</p><p>  char t[10];//t數(shù)組用來(lái)存放非終結(jié)符</p>&l

41、t;p>  t[0]=str[0][0];</p><p>  while(i<=n)</p><p><b>  {</b></p><p>  if(t[k]!=str[i][0])</p><p>  {k++;t[k]=str[i][0];g=t[k];i++;}</p><p&g

42、t;<b>  else i++;</b></p><p><b>  }</b></p><p><b>  kk=0;</b></p><p><b>  char c;</b></p><p>  for(i=0;i<=n;i++)</p

43、><p>  { int j=3;</p><p>  while(str[i][j]!='\0')</p><p><b>  {</b></p><p>  c=str[i][j];</p><p>  if(IsLetter(c)==0)</p><p>

44、<b>  {</b></p><p>  if(!search1(r,kk,c))</p><p>  r[kk]=c;kk++;//r數(shù)組用來(lái)存放終結(jié)符</p><p><b>  }</b></p><p><b>  j++;</b></p><p&

45、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  m=0;</b></p><p>  for(i=0;i<k;i++)</p><p>  for(int j=0;j<kk-1;j++)</p><

46、;p><b>  {</b></p><p>  F[m].R=t[i];</p><p>  F[m].r=r[j];</p><p>  F[m].flag=0;</p><p><b>  m++;</b></p><p><b>  }</b&g

47、t;</p><p><b>  }</b></p><p>  void search(charLode w)</p><p><b>  {</b></p><p>  for(int i=0;i<m;i++)</p><p>  if(F[i].R==w.E&am

48、p;&F[i].r==w.e)</p><p>  {F[i].flag=1;break;}</p><p><b>  }</b></p><p>  void FirstVT(int n) {</p><p>  charstack sta;</p><p>  charLode w;

49、</p><p><b>  int i=0;</b></p><p>  Initstack(sta);</p><p>  while(i<=n)</p><p><b>  {</b></p><p><b>  int k=3;</b>&l

50、t;/p><p>  w.E=str[i][0];</p><p>  char a=str[i][k];</p><p>  char b=str[i][k+1];</p><p>  if(!IsLetter(a)) {</p><p><b>  w.e=a;</b></p>

51、<p>  push(sta,w);</p><p>  search(w);</p><p><b>  i++;</b></p><p><b>  }</b></p><p>  else if(IsLetter(a)&&b!='\0'&&am

52、p;!IsLetter(b)) {</p><p><b>  w.e=b;</b></p><p>  push(sta,w);</p><p>  search(w);</p><p><b>  i++;</b></p><p><b>  }</b

53、></p><p><b>  else i++;</b></p><p><b>  }</b></p><p>  charLode ww;</p><p>  while(!IsEmpty(sta))</p><p><b>  {</b>&

54、lt;/p><p>  pop(sta,ww);</p><p>  for(i=0;i<=n;i++)</p><p><b>  {</b></p><p>  w.E=str[i][0];</p><p>  if(str[i][3]==ww.E&&str[i][4]==&

55、#39;\0')</p><p><b>  {</b></p><p><b>  w.e=ww.e;</b></p><p>  push(sta,w);</p><p>  search(w);</p><p><b>  break;</b&g

56、t;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  p=0;int k=1;i=1;</p><p>  while(i<m)</p>&l

57、t;p><b>  {</b></p><p>  if(F[i-1].flag==1)</p><p><b>  {</b></p><p>  arr[p][0]=F[i-1].R;</p><p>  arr[p][k]=F[i-1].r;</p><p>&l

58、t;b>  }</b></p><p>  while(F[i].flag==0&&i<m)</p><p><b>  i++;</b></p><p>  if(F[i].flag==1)</p><p><b>  {</b></p>&l

59、t;p>  if(F[i].R==arr[p][0])</p><p><b>  k++;</b></p><p>  else {arr[p][k+1]='\0';p++;k=1;}</p><p><b>  i++;</b></p><p><b>  }&l

60、t;/b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void LastVT(int n){</p><p>  charstack sta;</p><p>  charLode w;</p>

61、<p>  for(int i=0;i<m;i++)</p><p>  F[i].flag=0;</p><p><b>  i=0;</b></p><p>  Initstack(sta);</p><p>  while(i<=n)</p><p><b&g

62、t;  {</b></p><p>  int k=strlen(str[i]);</p><p>  w.E=str[i][0];</p><p>  char a=str[i][k-1];</p><p>  char b=str[i][k-2];</p><p>  if(!IsLetter(a))&

63、lt;/p><p><b>  {</b></p><p><b>  w.e=a;</b></p><p>  push(sta,w);</p><p>  search(w);</p><p><b>  i++;</b></p><

64、p><b>  }</b></p><p>  else if(IsLetter(a)&&!IsLetter(b))</p><p><b>  {</b></p><p><b>  w.e=b;</b></p><p>  push(sta,w);&l

65、t;/p><p>  search(w);</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  else i++;</b></p><p><b>  }</b></p

66、><p>  charLode ee;</p><p>  while(!IsEmpty(sta))</p><p><b>  {</b></p><p>  pop(sta,ee);</p><p>  for(i=0;i<=n;i++)</p><p><b&

67、gt;  {</b></p><p>  w.E=str[i][0];</p><p>  if(str[i][3]==ee.E&&str[i][4]=='\0')</p><p><b>  {</b></p><p><b>  w.e=ee.e;</b&g

68、t;</p><p>  push(sta,w);</p><p>  search(w);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

69、  int k=1;i=1;</p><p><b>  ppp=0;</b></p><p>  while(i<m)</p><p><b>  {</b></p><p>  if(F[i-1].flag==1)</p><p><b>  {</

70、b></p><p>  brr[ppp][0]=F[i-1].R;</p><p>  brr[ppp][k]=F[i-1].r;</p><p><b>  }</b></p><p>  while(F[i].flag==0&&i<m)</p><p><b

71、>  i++;</b></p><p>  if(F[i].flag==1)</p><p><b>  {</b></p><p>  if(F[i].R==arr[ppp][0])</p><p><b>  k++;</b></p><p>  els

72、e {brr[ppp][k+1]='\0';ppp++;k=1;}</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b>&

73、lt;/p><p>  void createYXB(int n)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(j=1;j<=kk;j++)</p><p>  ccrr1[0][j]=r[j-1

74、];</p><p>  for( i=1;i<=kk;i++)</p><p>  ccrr2[i][0]=r[i-1];</p><p>  for(i=1;i<=kk;i++)</p><p>  for(j=1;j<=kk;j++)</p><p>  crr[i][j]=0;</p&g

75、t;<p>  int I=0,J=3;</p><p>  while(I<=n)</p><p><b>  {</b></p><p>  if(str[I][J+1]=='\0')</p><p>  {I++;J=3;}</p><p><b&g

76、t;  else</b></p><p><b>  {</b></p><p>  while(str[I][J+1]!='\0')</p><p><b>  {</b></p><p>  char aa=str[I][J];</p><p>

77、;  char bb=str[I][J+1];</p><p>  if(!IsLetter(aa)&&!IsLetter(bb))</p><p><b>  { </b></p><p>  for(i=1;i<=kk;i++)</p><p><b>  { </b>&

78、lt;/p><p>  if(ccrr2[i][0]==aa)</p><p><b>  break; </b></p><p><b>  }</b></p><p>  for(j=1;j<=kk;j++)</p><p><b>  {</b>

79、</p><p>  if(ccrr1[0][j]==bb)</p><p><b>  break; </b></p><p><b>  }</b></p><p>  if(crr[i][j]==0)</p><p>  crr[i][j]=1;</p>

80、<p>  else {FLAG=1;I=n+1;}</p><p><b>  J++;</b></p><p><b>  }</b></p><p>  if(!IsLetter(aa)&&IsLetter(bb)&&str[I][J+2]!='\0'&am

81、p;&!IsLetter(str[I][J+2])) { </p><p>  for(i=1;i<=kk;i++)</p><p><b>  { </b></p><p>  if(ccrr2[i][0]==aa)</p><p><b>  break;</b><

82、;/p><p><b>  }</b></p><p>  for(int j=1;j<=kk;j++)</p><p>  { if(ccrr1[0][j]==str[I][J+2])</p><p><b>  break;</b></p><p><b&

83、gt;  }</b></p><p>  if(crr[i][j]==0)</p><p>  crr[i][j]=1;</p><p>  else {FLAG=1;I=n+1;}</p><p><b>  }</b></p><p>  if(!IsLetter(aa)&

84、&IsLetter(bb)) { </p><p>  for(i=1;i<=kk;i++)</p><p>  { if(aa==ccrr2[i][0])</p><p><b>  break;</b></p><p><b>  }</b></p>

85、<p>  for(j=0;j<=p;j++)</p><p>  { if(bb==arr[j][0])</p><p><b>  break;</b></p><p><b>  }</b></p><p>  for(int mm=1;arr[j][mm]!=

86、9;\0';mm++)</p><p><b>  { </b></p><p>  for(int pp=1;pp<=kk;pp++)</p><p><b>  {</b></p><p>  if(ccrr1[0][pp]==arr[j][mm])</p><

87、p><b>  break;</b></p><p><b>  }</b></p><p>  if(crr[i][pp]==0)</p><p>  crr[i][pp]=2;</p><p>  else {FLAG=1;I=n+1;}</p><p><b

88、>  }</b></p><p><b>  J++;</b></p><p><b>  }</b></p><p>  if(IsLetter(aa)&&!IsLetter(bb))</p><p><b>  { </b></p&g

89、t;<p>  for(i=1;i<=kk;i++)</p><p><b>  { </b></p><p>  if(ccrr1[0][i]==bb)</p><p><b>  break;</b></p><p><b>  }</b></p&

90、gt;<p>  for(j=0;j<=ppp;j++)</p><p><b>  {</b></p><p>  if(aa==brr[j][0])</p><p><b>  break;</b></p><p><b>  }</b></p&g

91、t;<p>  for(int mm=1;brr[j][mm]!='\0';mm++)</p><p><b>  { </b></p><p>  for(int pp=1;pp<=kk;pp++)</p><p><b>  {</b></p><p>  

92、if(ccrr2[pp][0]==brr[j][mm])</p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(crr[pp][i]==0)</p><p>  crr[pp][i]=3;</p><p>  el

93、se {FLAG=1;I=n+1;}</p><p><b>  }</b></p><p><b>  J++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&

94、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int judge3(char s,char a)</p><p><b>  {</b></p><p>  int

95、i=1,j=1;</p><p>  while(ccrr2[i][0]!=s)</p><p><b>  i++;</b></p><p><b>  j++;</b></p><p>  if(crr[i][j]==3) return 3;</p><p>  whil

96、e(ccrr1[0][j]!=a)</p><p>  else if(crr[i][j]==2) </p><p><b>  return 2;</b></p><p>  else if(crr[i][j]==1)</p><p><b>  return 1;</b></p>

97、<p>  else return 0;</p><p><b>  }</b></p><p>  void print(char s[],char STR[][20],int q,int u,int ii,int k) {</p><p>  cout<<u<<" ";&l

98、t;/p><p>  for(int i=0;i<=k;i++)</p><p>  cout<<s[i];</p><p>  cout<<" ";</p><p>  for(i=q;i<=ii;i++)</p><p>  cout<<

99、;STR[0][i];</p><p>  cout<<" ";</p><p><b>  }</b></p><p>  void process(char STR[][20],int ii)//對(duì)輸入的字符串進(jìn)行歸約的過(guò)程</p><p><b>  { &l

100、t;/b></p><p>  cout<<"步驟"<<" "<<"符號(hào)棧"<<" "<<"輸入串"<<" "<<"動(dòng)作"<<endl;</p&

101、gt;<p>  int k=0,q=0,u=0,b,i,j;</p><p>  char s[40],a;</p><p><b>  s[k]='#';</b></p><p>  print(s,STR,q,u,ii,k);</p><p>  cout<<"預(yù)

102、備"<<endl;</p><p><b>  k++;u++;</b></p><p>  s[k]=STR[0][q];</p><p><b>  q++;</b></p><p>  print(s,STR,q,u,ii,k);</p><p>

103、  cout<<"移進(jìn)"<<endl;</p><p>  while(q<=ii)</p><p><b>  {</b></p><p>  a=STR[0][q];</p><p>  if(!IsLetter(s[k])) j=k;</p><

104、p>  else j=k-1;</p><p>  b=judge3(s[j],a);</p><p>  if(b==3)//大于的情況進(jìn)行歸約</p><p><b>  {</b></p><p>  while(IsLetter(s[j-1]))</p><p><b> 

105、 j--;</b></p><p>  for(i=j;i<=k;i++)</p><p>  s[i]='\0';</p><p>  k=j;s[k]='N';u++;</p><p>  print(s,STR,q,u,ii,k);</p><p>  cout&

106、lt;<"歸約"<<endl;</p><p><b>  }</b></p><p>  else if(b==2||b==1)//小于或等于的情況移進(jìn)</p><p><b>  {</b></p><p><b>  k++;</b>

107、</p><p><b>  s[k]=a;</b></p><p><b>  u++;</b></p><p><b>  q++;</b></p><p>  print(s,STR,q,u,ii,k);</p><p>  if(s[0]==&#

108、39;#'&&s[1]=='N'&&s[2]=='#')</p><p>  cout<<"接受"<<endl;</p><p>  else cout<<"移進(jìn)"<<endl;</p><p><b&

109、gt;  }</b></p><p><b>  else </b></p><p>  {cout<<"出錯(cuò)"<<endl;break;}</p><p><b>  }</b></p><p>  if(s[0]=='#'&

110、amp;&s[1]=='N'&&s[2]=='#')</p><p>  cout<<"歸約成功"<<endl;</p><p>  else cout<<"歸約失敗"<<endl;</p><p><b>  }

111、</b></p><p>  void main()</p><p><b>  {</b></p><p>  int n,i,j;</p><p>  cout<<"請(qǐng)輸入你要定義的文法G的產(chǎn)生式的個(gè)數(shù)n:";</p><p><b>  

112、cin>>n;</b></p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  gets(str[i]);</p><p>  j=strlen(str[i]);</p><p>  str[i][j]=

113、9;\0';</p><p><b>  }</b></p><p>  str[i][0]='Q';</p><p>  str[i][1]='-';</p><p>  str[i][2]='>';</p><p>  str[i]

114、[3]='#';</p><p>  str[i][4]=str[0][0];</p><p>  str[i][5]='#';</p><p>  str[i][6]='\0';</p><p>  cout<<"你定義的產(chǎn)生式如下:"<<endl;

115、</p><p>  for(i=0;i<=n;i++)</p><p>  cout<<str[i]<<endl;</p><p>  if(judge1(n)==0)//判斷文法G是否為算符文法</p><p>  cout<<"文法G不是算符文法!"<<endl;

116、</p><p>  if(judge1(n)==1)</p><p><b>  {</b></p><p>  cout<<"文法G是算符文法!"<<endl;</p><p>  createF(n);</p><p>  FirstVT(n);&

117、lt;/p><p>  LastVT(n);</p><p>  createYXB(n);</p><p><b>  }</b></p><p>  judge2(n);//判斷文法G是否為算符優(yōu)先文法</p><p>  if(FLAG==0)</p><p><b

118、>  {</b></p><p>  for(i=0;i<=p;i++)//打印FirstVT</p><p><b>  {</b></p><p>  cout<<"FirstVT("<<arr[i][0]<<")={";</p>

119、<p>  for(int l=1;arr[i][l+1]!='\0';l++)</p><p>  cout<<arr[i][l]<<",";</p><p>  cout<<arr[i][l]<<"}"<<endl;</p><p>

120、<b>  }</b></p><p>  cout<<"FirstVT(Q)={#}"<<endl; </p><p>  for(i=0;i<=ppp;i++)//打印LastVT</p><p><b>  {</b></p><p>  co

121、ut<<"LastVT("<<arr[i][0]<<")={";</p><p>  for(int l=1;brr[i][l+1]!='\0';l++)</p><p>  cout<<brr[i][l]<<",";</p><p&g

122、t;  cout<<brr[i][l]<<"}"<<endl;</p><p><b>  }</b></p><p>  cout<<"LastVT(Q)={#}"<<endl;</p><p>  cout<<"優(yōu)先表如

123、下:"<<endl;</p><p>  for(i=1;i<kk;i++)//打印優(yōu)先關(guān)系表</p><p><b>  {</b></p><p>  cout<<" ";</p><p>  cout<<ccrr1[0][i];</p

124、><p><b>  }</b></p><p>  cout<<endl;</p><p>  for(i=1;i<kk;i++)</p><p><b>  {</b></p><p>  cout<<ccrr2[i][0]<<&qu

125、ot; ";</p><p>  for(j=1;j<kk;j++)</p><p><b>  {</b></p><p>  if(crr[i][j]==0)</p><p>  cout<<" ";</p><p>  else if(crr[

126、i][j]==1)</p><p>  cout<<"=";</p><p>  else if(crr[i][j]==2)</p><p>  cout<<"<";</p><p>  else if(crr[i][j]==3)</p><p> 

127、 cout<<">";</p><p>  cout<<" ";</p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p>&

128、lt;p><b>  }</b></p><p><b>  if(FF==1)</b></p><p><b>  {</b></p><p>  char STR[1][20];</p><p>  cout<<"請(qǐng)輸入要規(guī)約的字符串:"

129、;<<endl;</p><p>  gets(STR[0]);</p><p>  int ii=strlen(STR[0]);</p><p>  STR[0][ii]='#';</p><p>  cout<<"下面是規(guī)約的過(guò)程:"<<endl;</p>

溫馨提示

  • 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)論