編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩32頁(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>  課 程 設(shè) 計(jì) 報(bào) 告</p><p>  課程設(shè)計(jì)名稱(chēng): 編譯技術(shù) </p><p>  系 : 三 系 </p><p>  學(xué)生姓名: 王 輝 </p><p>  班 級(jí): 09軟件(1)班 </p><p>  學(xué) 號(hào):

2、 </p><p>  成 績(jī): </p><p>  指導(dǎo)教師: </p><p>  開(kāi)課時(shí)間: 2011-2012 學(xué)年 2 學(xué)期</p><p><b>  目錄</b></p><p><

3、;b>  一.設(shè)計(jì)題目1</b></p><p><b>  二.主要內(nèi)容1</b></p><p><b>  三.具體要求1</b></p><p><b>  四.進(jìn)度安排2</b></p><p><b>  五.成績(jī)?cè)u(píng)定2<

4、/b></p><p><b>  六.設(shè)計(jì)思路3</b></p><p><b>  1.詞法分析3</b></p><p> ?。?)單詞符號(hào)及種別表3</p><p>  2.SLR的分析表:4</p><p>  1). 算術(shù)表達(dá)式的SLR(1)分析表:

5、4</p><p>  2). 布爾表達(dá)式的SLR分析表:4</p><p>  3). 程序語(yǔ)句的SLR分析表:6</p><p>  七.源程序及運(yùn)行結(jié)果7</p><p><b>  1)源代碼:7</b></p><p><b>  2)運(yùn)行截圖28</b>

6、;</p><p><b>  八.心得體會(huì)31</b></p><p><b>  一.設(shè)計(jì)題目</b></p><p>  小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  二.主要內(nèi)容</b></p><p>  自定義一種簡(jiǎn)單的小

7、型高機(jī)程序設(shè)計(jì)語(yǔ)言,采用任意一種編程語(yǔ)言和編程工具設(shè)計(jì)并實(shí)現(xiàn)其編譯器,展示編譯系統(tǒng)中詞法分析和語(yǔ)法分析的全過(guò)程。</p><p><b>  三.具體要求</b></p><p>  1、對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;</p><p>  2、編寫(xiě)的詞法分析程序能夠正確識(shí)別源程序中的單詞符號(hào);</p><p>  3、識(shí)

8、別出的單詞以<種別碼,值>的二元式形式保存在符號(hào)表中并輸出;</p><p>  4、構(gòu)造出程序設(shè)計(jì)語(yǔ)言各語(yǔ)法單位的SLR分析表;(其他分析表亦可)</p><p>  5、能夠?qū)斎氲脑闯绦蜃龀稣_的語(yǔ)法分析并輸出清晰的結(jié)果;</p><p>  6、高級(jí)語(yǔ)言的規(guī)模不易過(guò)大,注重編譯器內(nèi)核的設(shè)計(jì),對(duì)于界面無(wú)要求;</p><p>

9、;  7、課程設(shè)計(jì)報(bào)告中應(yīng)對(duì)所自定義高級(jí)語(yǔ)言進(jìn)行簡(jiǎn)單描述,對(duì)編譯器的設(shè)計(jì)進(jìn)行簡(jiǎn)單的需求分析,給出設(shè)計(jì)說(shuō)明和程序結(jié)構(gòu)框架,闡明設(shè)計(jì)思路、用到的原理和方法。</p><p>  8、不可更改課程設(shè)計(jì)報(bào)告中已有的字體和格式,課程設(shè)計(jì)報(bào)告中新加入內(nèi)容,漢字采用宋體五號(hào)字,英文字符和數(shù)字采用Times New Roman五號(hào)字。</p><p>  9、課程設(shè)計(jì)報(bào)告中的運(yùn)行結(jié)果應(yīng)以程序運(yùn)行截圖形式出

10、現(xiàn)。</p><p>  10、程序源代碼以郵件名稱(chēng):“班級(jí)學(xué)號(hào)姓名”發(fā)送至指定郵箱:sqckcsj08@126.com</p><p><b>  四.進(jìn)度安排</b></p><p><b>  五.成績(jī)?cè)u(píng)定</b></p><p>  1.考核方法:通過(guò)現(xiàn)場(chǎng)考勤、檢查源程序和批改課程設(shè)計(jì)報(bào)告相

11、結(jié)合的方式考察學(xué)生的動(dòng)手能力,獨(dú)立分析解決問(wèn)題的能力和創(chuàng)新精神,并根據(jù)學(xué)生的學(xué)習(xí)態(tài)度綜合考評(píng)。</p><p>  2.成績(jī)?cè)u(píng)定:成績(jī)分優(yōu)、良、中、及格和不及格五等。</p><p><b>  六.設(shè)計(jì)思路</b></p><p><b>  1.詞法分析</b></p><p> ?。?)單詞符

12、號(hào)及種別表</p><p>  2.SLR的分析表:</p><p>  1). 算術(shù)表達(dá)式的SLR(1)分析表:</p><p>  算數(shù)表達(dá)式文法G[E]如下:</p><p>  E->E+E|E*E|(E)|i</p><p>  將文法G[E]拓廣為文法G’[E]:(0) S’→E</p>

13、<p><b>  E→E+E</b></p><p><b>  E→E*E</b></p><p><b>  E→(E)</b></p><p><b>  E→i</b></p><p>  由此得到算數(shù)表達(dá)式的SLR(1)分析表如下:

14、</p><p>  2). 布爾表達(dá)式的SLR分析表:</p><p>  布爾表達(dá)式的文法如下:</p><p>  B->B∧B|B∨B|¬B|I rop i|i</p><p>  為了便于語(yǔ)法分析時(shí)加工處理,我們將上述文法改為文法G[S]:</p><p>  B→BAB|B0B|¬

15、B|(B)|I rop i|i</p><p><b>  BA→B∧</b></p><p><b>  B0 →B∨</b></p><p>  將文法G[S]拓廣為文法G[S’]:(0)S’→B</p><p><b>  B →i</b></p><

16、;p>  B →I rop i</p><p><b>  B →(B)</b></p><p><b>  B →NOT B</b></p><p><b>  A →B AND</b></p><p><b>  B →AB</b>&l

17、t;/p><p><b>  O →B OR</b></p><p><b>  B →OB</b></p><p>  由此得到布爾表達(dá)式的SLR(1)分析表如下:</p><p>  3). 程序語(yǔ)句的SLR分析表:</p><p>  程序語(yǔ)句的文法G[S]如下<

18、/p><p>  S→if e then S else S|while e do S|begin L end|a</p><p><b>  L→S;L|S</b></p><p>  由于在編譯程序設(shè)計(jì)與視線(xiàn)中,我們是將賦值語(yǔ)句與算數(shù)表達(dá)式歸為一類(lèi)處理的,故在此將賦值語(yǔ)句僅看作是程序語(yǔ)句文法中一個(gè)終結(jié)符a,將布爾表達(dá)式B也看作為終結(jié)符e。<

19、/p><p>  將文法G[S]拓廣為文法G[S’]:</p><p><b>  (0)S’ →S</b></p><p>  S →if e then S else S</p><p>  S →while e do S</p><p>  S →begin L end</p>

20、<p><b>  S →a</b></p><p><b>  L →S</b></p><p><b>  L →S;L</b></p><p>  由此得到程序語(yǔ)句的SLR(1)分析表如下:</p><p>  七.源程序及運(yùn)行結(jié)果</p>

21、<p><b>  1)源代碼:</b></p><p>  #include<stdio.h></p><p>  #include<string.h></p><p>  #include<stdlib.h></p><p>  #define ACC -2</p

22、><p>  /***************************************************************/</p><p>  #define sy_if0</p><p>  #define sy_then1</p><p>  #define sy_else2</p><

23、p>  #define sy_while3</p><p>  #define sy_begin4</p><p>  #define sy_do5</p><p>  #define sy_end6</p><p>  #define a7</p><p>  #define semi

24、colon8</p><p>  #define e9</p><p>  #define jinghao10</p><p>  #define S11</p><p>  #define L12</p><p>  #define tempsy15</p><

25、p>  #define EA18</p><p>  #define EO19</p><p>  #define plus34</p><p>  #define times36</p><p>  #define becomes38</p><p>  #define op_and

26、39</p><p>  #define op_or40</p><p>  #define op_not41</p><p>  #define rop42</p><p>  #define lparent48</p><p>  #define rparent49</p>

27、<p>  #define ident56</p><p>  #define intconst57</p><p>  /***************************************************************/</p><p>  charch='\0';</p>&

28、lt;p>  intcount=0;</p><p>  static char spelling[10]={" "};</p><p>  static char line[81]={" "};</p><p>  char*pline;</p><p>  staticch

29、ar ntab1[100][10];</p><p>  structntab{</p><p><b>  int tc;</b></p><p><b>  int fc;</b></p><p>  }ntab2[200];</p><p>  intlabel=0

30、;</p><p>  struct rwords{</p><p>  char sp[10];</p><p><b>  intsy;</b></p><p><b>  };</b></p><p>  struct rwords reswords[10]={&l

31、t;/p><p>  {"if",sy_if},</p><p>  {"do",sy_do},</p><p>  {"else",sy_else},</p><p>  {"while",sy_while},</p><p>  {&quo

32、t;then",sy_then},</p><p>  {"begin",sy_begin},</p><p>  {"end",sy_end},</p><p>  {"and",op_and},</p><p>  {"or",op_or},<

33、/p><p>  {"not",op_not}</p><p><b>  };</b></p><p>  struct aa{</p><p><b>  int sy1;</b></p><p><b>  int pos;</b>

34、</p><p>  }buf[1000],</p><p><b>  n,</b></p><p><b>  n1,</b></p><p><b>  E,</b></p><p>  sstack[100],</p><p&

35、gt;  ibuf[100],</p><p>  stack[1000];</p><p>  struct aa oth;</p><p>  struct fourexp{</p><p>  charop[10];</p><p>  structaa arg1;</p><p> 

36、 structaa arg2;</p><p>  intresult;</p><p>  }fexp[200];</p><p>  intssp=0;</p><p>  structaa *pbuf=buf;</p><p>  intnlength=0;</p><p>

37、;  intlnum=0;</p><p>  inttt1=0;</p><p>  FILE*cfile;</p><p>  /***************************************************************/</p><p>  intnewt=0;</p>&

38、lt;p>  intnxq=100;</p><p><b>  intlr;</b></p><p><b>  intlr1;</b></p><p>  intsp=0;</p><p>  intstack1[100];</p><p>  

39、intsp1=0;</p><p>  intnum=0;</p><p>  structll{</p><p><b>  int nxq1;</b></p><p><b>  int tc1;</b></p><p><b>  int fc1;&

40、lt;/b></p><p>  }labelmark[10];</p><p>  int labeltemp[10];</p><p>  int pointmark=-1,</p><p>  pointtemp=-1;</p><p>  int sign=0;</p><p> 

41、 /********************* 程序語(yǔ)句的LR分析表 **********************/</p><p>  static int action[19][13]={</p><p>  /* 0*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,1,-1},</p><p>  /* 1*/{-1,-1,-1,-1,-1,-1

42、,-1,-1,-1,-1,ACC,-1,-1},</p><p>  /* 2*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},</p><p>  /* 3*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,},</p><p>  /* 4*/{2,-1,-1,3,5,-1,-1,5,-1,-1,-

43、1,9,8},</p><p>  /* 5*/{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},</p><p>  /* 6*/{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p>  /* 7*/{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1}

44、,</p><p>  /* 8*/{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},</p><p>  /* 9*/{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},</p><p>  /*10*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},</p>

45、<p>  /*11*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},</p><p>  /*12*/{-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},</p><p>  /*13*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},</p><p>  /*14

46、*/{-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p>  /*15*/{-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},</p><p>  /*16*/{-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},</p><p>  /*17*/{2,

47、-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},</p><p>  /*18*/{-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}</p><p><b>  };</b></p><p>  /***************** 算術(shù)表達(dá)式的LR分析表 ***************

48、********/</p><p>  static int action1[10][7]={</p><p>  /* 0*/{3,-1,-1,2,-1,-1,1},</p><p>  /* 1*/{-1,4,5,-1,-1,ACC,-1},</p><p>  /* 2*/{3,-1,-1,2,-1,-1,6},</p>

49、<p>  /* 3*/{-1,104,104,-1,104,104,-1},</p><p>  /* 4*/{3,-1,-1,2,-1,-1,7},</p><p>  /* 5*/{3,-1,-1,2,-1,-1,8},</p><p>  /* 6*/{-1,4,5,-1,9,-1,-1},</p><p>  /* 7*/

50、{-1,101,5,-1,101,101,-1},</p><p>  /* 8*/{-1,102,102,-1,102,102,-1},</p><p>  /* 9*/{-1,103,103,-1,103,103,-1}</p><p><b>  };</b></p><p>  /***************

51、布爾表達(dá)式LR分析表 **************************/</p><p>  static int action2[16][11]={</p><p>  /* 0*/{1,-1,4,-1,5,-1,-1,-1,13,7,8},</p><p>  /* 1*/{-1,2,-1,101,101,101,-1,-1,-1,},</p>

52、<p>  /* 2*/{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p>  /* 3*/{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},</p><p>  /* 4*/{1,-1,4,-1,5,-1,-1,-1,11,7,8},</p><p>  /* 5*/{1,-1,4,-1,

53、5,-1,-1,-1,6,7,8},</p><p>  /* 6*/{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},</p><p>  /* 7*/{1,-1,4,-1,5,-1,-1,-1,14,7,8},</p><p>  /* 8*/{1,-1,4,-1,5,-1,-1,-1,15,7,8},</p><p&g

54、t;  /* 9*/{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},</p><p>  /*10*/{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},</p><p>  /*11*/{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},</p><p>  /*12*/{-1,-1,-1,103

55、,-1,103,103,103,-1,-1,-1},</p><p>  /*13*/{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},</p><p>  /*14*/{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},</p><p>  /*15*/{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}&

56、lt;/p><p><b>  };</b></p><p>  /************* 從文件讀取一行到緩沖區(qū) *************************/</p><p>  void readline()</p><p><b>  {</b></p><p>

57、;<b>  char ch1;</b></p><p>  pline=line;</p><p>  ch1=getc(cfile);</p><p>  while(ch1!='\n'){</p><p>  *pline=ch1;</p><p><b>  pl

58、ine++;</b></p><p>  ch1=getc(cfile);</p><p><b>  }</b></p><p>  *pline='\0';</p><p>  pline=line;</p><p><b>  }</b>&l

59、t;/p><p>  /***************** 從緩沖區(qū)讀取一個(gè)字符 ***********************/</p><p>  void readch()</p><p><b>  {</b></p><p>  if(ch=='\0'){</p><p> 

60、 readline();</p><p><b>  lnum++;</b></p><p><b>  }</b></p><p>  ch=*pline;</p><p><b>  pline++;</b></p><p><b>  }

61、</b></p><p>  /**************** 標(biāo)識(shí)符和關(guān)鍵字的識(shí)別 *************************/</p><p>  int find(char spel[])</p><p><b>  {</b></p><p>  int ss1=0;</p>

62、<p><b>  int ii=0;</b></p><p>  while((ss1==0)&&(ii<nlength)){</p><p>  if(!strcmp(spel,ntab1[ii])) ss1=1;</p><p><b>  ii++;</b></p>&

63、lt;p><b>  }</b></p><p>  if(ss1==1) return ii-1;</p><p>  else return -1;</p><p><b>  }</b></p><p>  void identifier()</p><p>&l

64、t;b>  {</b></p><p>  int iii=0,j,k;</p><p><b>  int ss=0;</b></p><p><b>  k=0;</b></p><p><b>  do{</b></p><p>

65、  spelling[k]=ch;</p><p><b>  k++;</b></p><p><b>  readch();</b></p><p>  }while(((ch>='a')&&(ch<='z'))||((ch>='0')&

66、amp;&(ch<='9')));</p><p><b>  pline--;</b></p><p>  spelling[k]='\0';</p><p>  while((ss==0)&&(iii<10)){</p><p>  if(!strc

67、mp(spelling,reswords[iii].sp)) ss=1;</p><p><b>  iii++;</b></p><p><b>  }</b></p><p><b>  /*關(guān)鍵字匹配*/</b></p><p>  if(ss==1){</p>

68、;<p>  buf[count].sy1=reswords[iii-1].sy;</p><p><b>  }</b></p><p><b>  else{</b></p><p>  buf[count].sy1=ident;</p><p>  j=find(spelling

69、);</p><p>  if(j==-1){</p><p>  buf[count].pos=tt1;</p><p>  strcpy(ntab1[tt1],spelling);</p><p><b>  tt1++;</b></p><p>  nlength++;</p>

70、<p><b>  }</b></p><p>  else buf[count].pos=j;</p><p><b>  }</b></p><p><b>  count++;</b></p><p><b>  }</b></p&

71、gt;<p>  /******************** 數(shù)字識(shí)別 *********************************/</p><p>  void number()</p><p><b>  {</b></p><p>  int ivalue=0;</p><p>  int d

72、igit;</p><p><b>  do{</b></p><p>  digit=ch-'0';</p><p>  ivalue=ivalue*10+digit;</p><p><b>  readch();</b></p><p>  }while

73、((ch>='0')&&(ch<='9'));</p><p>  buf[count].sy1=intconst;</p><p>  buf[count].pos=ivalue;</p><p><b>  count++;</b></p><p><

74、b>  pline--;</b></p><p><b>  }</b></p><p>  /****************** 掃描主函數(shù) ********************************/</p><p>  void scan()</p><p><b>  {&l

75、t;/b></p><p><b>  //int i;</b></p><p>  while(ch!='~'){</p><p>  switch(ch){</p><p><b>  case ' ':</b></p><p>&

76、lt;b>  break;</b></p><p><b>  case 'a':</b></p><p><b>  case 'b':</b></p><p><b>  case 'c':</b></p><p

77、><b>  case 'd':</b></p><p><b>  case 'e':</b></p><p><b>  case 'f':</b></p><p><b>  case 'g':</b>&

78、lt;/p><p><b>  case 'h':</b></p><p><b>  case 'i':</b></p><p><b>  case 'j':</b></p><p><b>  case 'k&

79、#39;:</b></p><p><b>  case 'l':</b></p><p><b>  case 'm':</b></p><p><b>  case 'n':</b></p><p><b&g

80、t;  case 'o':</b></p><p><b>  case 'p':</b></p><p><b>  case 'q':</b></p><p><b>  case 'r':</b></p>

81、<p><b>  case 's':</b></p><p><b>  case 't':</b></p><p><b>  case 'u':</b></p><p><b>  case 'v':</b

82、></p><p><b>  case 'w':</b></p><p><b>  case 'x':</b></p><p><b>  case 'y':</b></p><p><b>  case &#

83、39;z':</b></p><p>  identifier();</p><p><b>  break;</b></p><p><b>  case '0':</b></p><p><b>  case '1':</b&g

84、t;</p><p><b>  case '2':</b></p><p><b>  case '3':</b></p><p><b>  case '4':</b></p><p><b>  case '

85、;5':</b></p><p><b>  case '6':</b></p><p><b>  case '7':</b></p><p><b>  case '8':</b></p><p><

86、b>  case '9':</b></p><p><b>  number();</b></p><p><b>  break;</b></p><p><b>  case '<':</b></p><p><

87、b>  readch();</b></p><p>  if(ch=='='){</p><p>  buf[count].pos=0;</p><p><b>  }</b></p><p><b>  else{</b></p><p>

88、  if(ch=='>') buf[count].pos=4;</p><p><b>  else{</b></p><p>  buf[count].pos=1;</p><p><b>  pline--;</b></p><p><b>  }</b&g

89、t;</p><p><b>  }</b></p><p>  buf[count].sy1=rop;</p><p><b>  count++;</b></p><p><b>  break;</b></p><p><b>  cas

90、e '>':</b></p><p><b>  readch();</b></p><p>  if(ch=='='){</p><p>  buf[count].pos=2;</p><p><b>  }</b></p><

91、p><b>  else{</b></p><p>  buf[count].pos=3;</p><p><b>  pline--;</b></p><p><b>  }</b></p><p>  buf[count].sy1=rop;</p>&l

92、t;p><b>  count++;</b></p><p><b>  break;</b></p><p><b>  case '(':</b></p><p>  buf[count].sy1=lparent;</p><p><b> 

93、 count++;</b></p><p><b>  break;</b></p><p><b>  case ')':</b></p><p>  buf[count].sy1=rparent;</p><p><b>  count++;</b&g

94、t;</p><p><b>  break;</b></p><p><b>  case '#':</b></p><p>  buf[count].sy1=jinghao;</p><p><b>  count++;</b></p><

95、;p><b>  break;</b></p><p><b>  case '+':</b></p><p>  buf[count].sy1=plus;</p><p><b>  count++;</b></p><p><b>  bre

96、ak;</b></p><p><b>  case '*':</b></p><p>  buf[count].sy1=times;</p><p><b>  count++;</b></p><p><b>  break;</b></p

97、><p><b>  case ':':</b></p><p><b>  readch();</b></p><p>  if(ch=='=')</p><p>  buf[count].sy1=becomes;</p><p><b&g

98、t;  count++;</b></p><p><b>  break;</b></p><p><b>  case '=':</b></p><p>  buf[count].sy1=rop;</p><p>  buf[count].pos=5;</p>

99、;<p><b>  count++;</b></p><p><b>  break;</b></p><p><b>  case ';':</b></p><p>  buf[count].sy1=semicolon;</p><p><

100、;b>  count++;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  readch();</b></p><p><b>  }</b></p>

101、;<p>  buf[count].sy1=-1;</p><p><b>  }</b></p><p>  /***************************************************************/</p><p>  void readnu()</p><p>

102、<b>  {</b></p><p>  if(pbuf->sy1>=0){</p><p>  n.sy1=pbuf->sy1;</p><p>  n.pos=pbuf->pos;</p><p><b>  pbuf++;</b></p><p&g

103、t;<b>  }</b></p><p><b>  }</b></p><p>  /******************* 中間變量生成 ******************************/</p><p>  int newtemp()</p><p><b>  {&l

104、t;/b></p><p><b>  newt++;</b></p><p>  return newt;</p><p><b>  }</b></p><p>  /********************** 生成四元式 *****************************/&l

105、t;/p><p>  int gen(char op1[],struct aa arg11,struct aa arg22,int result1)</p><p><b>  {</b></p><p>  strcpy(fexp[nxq].op,op1);</p><p>  fexp[nxq].arg1.sy1=arg

106、11.sy1;</p><p>  fexp[nxq].arg1.pos=arg11.pos;</p><p>  fexp[nxq].arg2.sy1=arg22.sy1;</p><p>  fexp[nxq].arg2.pos=arg22.pos;</p><p>  fexp[nxq].result=result1;</p>

107、;<p><b>  nxq++;</b></p><p>  return nxq-1;</p><p><b>  }</b></p><p>  /********************** 布爾表達(dá)式的匹配 ***********************/</p><p> 

108、 int merg(int p1,int p2)//拉鏈函數(shù)</p><p><b>  {</b></p><p><b>  int p;</b></p><p>  if(p2==0) return p1;</p><p><b>  else{</b>&l

109、t;/p><p><b>  p=p2;</b></p><p>  while(fexp[p].result!=0)p=fexp[p].result;</p><p>  fexp[p].result=p1;</p><p>  return p2;</p><p><b>  }<

110、/b></p><p><b>  }</b></p><p>  void backpatch(int p,int t)//返填函數(shù)</p><p><b>  {</b></p><p>  int tempq;</p><p><b>  i

111、nt q;</b></p><p><b>  q=p;</b></p><p>  while(q!=0){</p><p>  tempq=fexp[q].result;</p><p>  fexp[q].result=t;</p><p><b>  q=tempq;

112、</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /***************************************************************/</p><p>  int change1(i

113、nt chan)</p><p><b>  {</b></p><p>  switch(chan){</p><p>  case ident:</p><p>  case intconst:</p><p><b>  return 0;</b></p>

114、<p>  case plus:</p><p><b>  return 1;</b></p><p>  case times:</p><p><b>  return 2;</b></p><p>  case lparent:</p><p><b

115、>  return 3;</b></p><p>  case rparent:</p><p><b>  return 4;</b></p><p>  case jinghao:</p><p><b>  return 5;</b></p><p>

116、  case tempsy:</p><p><b>  return 6;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int change2(int chan)</p><p><

117、b>  {</b></p><p>  switch(chan){</p><p>  case ident:</p><p>  case intconst:</p><p><b>  return 0;</b></p><p><b>  case rop:<

118、;/b></p><p><b>  return 1;</b></p><p>  case lparent:</p><p><b>  return 2;</b></p><p>  case rparent:</p><p><b>  return

119、3;</b></p><p>  case op_not:</p><p><b>  return 4;</b></p><p>  case op_and:</p><p><b>  return 5;</b></p><p>  case op_or:&l

120、t;/p><p><b>  return 6;</b></p><p>  case jinghao:</p><p><b>  return 7;</b></p><p>  case tempsy:</p><p><b>  return 8;</b&g

121、t;</p><p><b>  case EA:</b></p><p><b>  return 9;</b></p><p><b>  case EO:</b></p><p>  return 10;</p><p><b>  }&

122、lt;/b></p><p><b>  }</b></p><p>  /******************* 賦值語(yǔ)句的分析 **************************/</p><p>  void lrparse1(int num)</p><p><b>  {</b>&

123、lt;/p><p>  lr1=action1[stack1[sp1]][change1(n1.sy1)];</p><p>  if(lr1==-1){</p><p>  printf("\n算數(shù)表達(dá)式或賦值語(yǔ)句出錯(cuò)!\n");</p><p>  getchar();</p><p><b&

124、gt;  exit(0);</b></p><p><b>  }</b></p><p>  if((lr1<10)&&(lr1>=0)){ //移進(jìn)</p><p><b>  sp1++;</b></p><p>  stack1

125、[sp1]=lr1;</p><p>  if(n1.sy1!=tempsy){</p><p><b>  ssp++;</b></p><p><b>  num++;</b></p><p>  sstack[ssp].sy1=n1.sy1;</p><p>  sst

126、ack[ssp].pos=n1.pos;</p><p><b>  }</b></p><p>  n1.sy1=ibuf[num].sy1; </p><p><b>  }</b></p><p>  if((lr1>=100)&&(lr1<105)){

127、 //歸約</p><p>  switch(lr1){</p><p><b>  case 100:</b></p><p><b>  break;</b></p><p><b>  case 101:</b></p><p>  E.p

128、os=newtemp();</p><p>  gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);</p><p>  ssp=ssp-2;</p><p>  sstack[ssp].sy1=tempsy;</p><p>  sstack[ssp].pos=E.pos;</

129、p><p>  sp1=sp1-3;</p><p><b>  break;</b></p><p><b>  case 103:</b></p><p>  E.pos=sstack[ssp-1].pos;</p><p>  ssp=ssp-2;</p>&

130、lt;p>  sstack[ssp].sy1=tempsy;</p><p>  sstack[ssp].pos=E.pos;</p><p>  sp1=sp1-3;</p><p><b>  break;</b></p><p><b>  case 104:</b></p>

131、<p>  E.pos=sstack[ssp].pos;</p><p><b>  sp1--;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  n1.sy1=tempsy;</p>

132、;<p>  n1.pos=E.pos;</p><p>  lrparse1(num);</p><p><b>  }</b></p><p>  if((lr1==ACC)&&(stack1[sp1]==1)){ </p><p>  gen(":="

133、;,sstack[ssp],oth,ibuf[0].pos);</p><p>  ssp=ssp-3;</p><p>  sp1=sp1-3;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*************

134、***** 布爾表達(dá)式的分析 *************************/</p><p>  int lrparse2(int num)</p><p><b>  {</b></p><p>  int templabel;</p><p>  lr1=action2[stack1[sp1]][change2

135、(n1.sy1)];</p><p>  if(lr1==-1){</p><p>  if(sign==2) printf("\nwhile語(yǔ)句出錯(cuò)!\n");</p><p>  if(sign==3) printf("\nif語(yǔ)句出錯(cuò)! \n");</p><p>  getchar();<

136、/p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  if((lr1<16)&&(lr1>=0)){</p><p><b>  sp1++;</b></p><p>  

137、stack1[sp1]=lr1;</p><p><b>  ssp++;</b></p><p>  sstack[ssp].sy1=n1.sy1;</p><p>  sstack[ssp].pos=n1.pos;</p><p>  if((n1.sy1!=tempsy)&&(n1.sy1!=EA)

138、&&(n1.sy1!=EO))</p><p><b>  num++;</b></p><p>  n1.sy1=ibuf[num].sy1;</p><p>  n1.pos=ibuf[num].pos;</p><p>  lrparse2(num);</p><p><

139、;b>  }</b></p><p>  if((lr1>=100)&&(lr1<109)){</p><p>  switch(lr1){</p><p><b>  case 100:</b></p><p><b>  break;</b><

140、/p><p><b>  case 101:</b></p><p>  ntab2[label].tc=nxq;</p><p>  ntab2[label].fc=nxq+1;</p><p>  gen("jnz",sstack[ssp],oth,0);</p><p>  

141、gen("j",oth,oth,0);</p><p><b>  sp1--;</b></p><p><b>  ssp--;</b></p><p><b>  label++;</b></p><p>  n1.sy1=tempsy;</p&g

142、t;<p><b>  break;</b></p><p><b>  case 102:</b></p><p>  ntab2[label].tc=nxq;</p><p>  ntab2[label].fc=nxq+1;</p><p>  switch(sstack[ssp-

143、1].pos){</p><p><b>  case 0:</b></p><p>  gen("j<=",sstack[ssp-2],sstack[ssp],0);</p><p><b>  break;</b></p><p><b>  case 1:&

144、lt;/b></p><p>  gen("j<",sstack[ssp-2],sstack[ssp],0);</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  gen("j>=&

145、quot;,sstack[ssp-2],sstack[ssp],0);</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  gen("j>",sstack[ssp-2],sstack[ssp],0);</p>&l

146、t;p><b>  break;</b></p><p><b>  case 4:</b></p><p>  gen("j<>",sstack[ssp-2],sstack[ssp],0);</p><p><b>  break;</b></p>

147、<p><b>  case 5:</b></p><p>  gen("j=",sstack[ssp-2],sstack[ssp],0);</p><p><b>  break;</b></p><p><b>  }</b></p><p>

148、;  gen("j",oth,oth,0);</p><p>  ssp=ssp-3;</p><p>  sp1=sp1-3;</p><p><b>  label++;;</b></p><p>  n1.sy1=tempsy;</p><p><b>  br

149、eak;</b></p><p><b>  case 103:</b></p><p>  label=label-1;</p><p>  ssp=ssp-3;</p><p>  sp1=sp1-3;</p><p><b>  label++;</b>&l

150、t;/p><p>  n1.sy1=tempsy;</p><p><b>  break;</b></p><p><b>  case 104:</b></p><p>  label=label-1;</p><p>  templabel=ntab2[label].tc;

溫馨提示

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