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

下載本文檔

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

文檔簡介

1、<p><b>  編譯原理課程設(shè)計</b></p><p>  題 目 語法分析器</p><p>  學(xué)生姓名 </p><p><b>  學(xué)號 </b></p><p>  學(xué) 院 </p><

2、p>  專 業(yè) 軟件工程</p><p>  指導(dǎo)教師 </p><p>  二O一三 年 一月 十日</p><p><b>  目 錄</b></p><p><b>  1 系統(tǒng)目標(biāo)1</b></p><p>  1.1 要

3、求介紹1</p><p>  1.2 功能要求1</p><p>  2 邏輯設(shè)計過程4</p><p><b>  3 系統(tǒng)展示4</b></p><p><b>  4 系統(tǒng)實現(xiàn)6</b></p><p>  4.1詞法分析的實現(xiàn)6</p>&l

4、t;p>  4.2語法分析的實現(xiàn)13</p><p><b>  1 系統(tǒng)目標(biāo)</b></p><p><b>  1.1 要求介紹</b></p><p>  課程設(shè)計所用的Tiny文法:</p><p>  Program → stmt-sequence </p><

5、p>  stmt-sequence →stmt-sequence ;statement | statement </p><p>  statement → if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt </p><p>  if-stmt →if exp then stmt-sequence end <

6、;/p><p>  | if exp then stmt-sequence else stmt-sequence end </p><p>  repeat-stmt → repeat stmt-sequence until exp </p><p>  assign-stmt →identifier := exp </p><p>  rea

7、d-stmt → read identifier </p><p>  write-stmt → write exp </p><p>  exp→ simple-exp comparison-op simple-exp | simple-exp </p><p>  simple-exp → simple-exp addop term | term <

8、/p><p>  comparison-op →<|= addop→+|- mulop→*|/ </p><p>  term → term mulop factor | factor </p><p>  factor →( exp ) | number | identifier</p><p>  Tiny語言關(guān)鍵字表:<

9、;/p><p>  其他:  標(biāo)志符: identifier  種別碼: 21   助記符: $ID      </p><p>  數(shù) 字 : number      種別碼: 22     助記符:

10、 $NUMBER</p><p><b>  1.2 功能要求</b></p><p>  根據(jù)Tiny文法的要求,能夠?qū)φZ句進(jìn)行詞法分析,當(dāng)詞法分析正確時能夠進(jìn)行語法分析,生成語法樹,當(dāng)語法發(fā)生錯誤時能夠進(jìn)行報錯。</p><p><b>  邏輯設(shè)計過程</b></p><p>  2-1 軟件

11、總體結(jié)構(gòu)</p><p>  本軟件包括下面3個功能模塊:詞法分析功能模塊;語法分析功能模塊;輸出模塊。</p><p>  2-2Tiny語言語法圖如下:</p><p><b>  2-3總體思路</b></p><p>  在實現(xiàn)之前首先實現(xiàn)EBNF,消除左遞歸和左因子,為遞歸下降程序做好準(zhǔn)備。</p>

12、<p>  對于語句和表達(dá)式采用枚舉的形式定義,形成一個統(tǒng)一的樹結(jié)點結(jié)構(gòu)。</p><p>  把正確源程序的首先經(jīng)過詞法分析形成二元式記號提供給語法分析程序。</p><p>  如果出現(xiàn)錯誤,指出錯誤的位置和類型。</p><p>  把語法樹按照樹的前序遍歷的形式把所有的結(jié)點按照某種形式輸出。</p><p>  2-4T

13、iny語法樹結(jié)構(gòu)</p><p>  Tiny編輯器的語法樹結(jié)構(gòu):</p><p><b>  系統(tǒng)展示</b></p><p><b>  Tiny代碼例子:</b></p><p><b>  詞法分析的結(jié)果:</b></p><p><b&g

14、t;  語法分析的結(jié)果:</b></p><p><b>  發(fā)生錯誤時:</b></p><p><b>  Tiny代碼例子:</b></p><p><b>  分析結(jié)果:</b></p><p><b>  4.系統(tǒng)實現(xiàn)</b><

15、/p><p>  進(jìn)行詞法分析的部分代碼:</p><p>  void CiFa::back() //后退一個字節(jié)</p><p><b>  {</b></p><p>  if (cur != 0) //當(dāng)前在處理區(qū)中的位置</p><p><

16、;b>  cur--;</b></p><p><b>  }</b></p><p>  void CiFa::forward() //讀取一個字節(jié)</p><p><b>  {</b></p><p>  if (cur == 999)</p>&

17、lt;p><b>  {</b></p><p>  readFile();</p><p><b>  cur = 0;</b></p><p><b>  }else{</b></p><p><b>  cur++;</b></p>

18、<p><b>  }</b></p><p><b>  }</b></p><p>  void CiFa::distinguish() //識別一個單詞</p><p><b>  {</b></p><p>  char temp[20];</

19、p><p>  memset(temp, 0, 20);</p><p><b>  char ch;</b></p><p>  int i = 0;</p><p>  ch = buffer[cur];</p><p>  bool match = false;</p><p

20、>  if(isalpha(ch)) //識別變量和保留字 isalpha判斷ch是否為英文字符 </p><p><b>  {</b></p><p>  temp[i] = ch;</p><p>  this->f

21、orward();</p><p>  ch = buffer[cur];</p><p>  while (isalpha(ch)||isalnum(ch)) //判斷是否為數(shù)字或字符</p><p><b>  {</b></p><p><b>  i++;</b>&l

22、t;/p><p>  temp[i] = ch;</p><p>  this->forward();</p><p>  ch = buffer[cur];</p><p><b>  }</b></p><p>  this->back();</p><p>&

23、lt;b>  i++;</b></p><p>  temp[i] = '\0';</p><p>  for(int n = 0; n < 8; n++ )</p><p>  if (strcmp(temp, r[n].key) == 0)</p><p><b>  {</b>

24、;</p><p>  match = true;</p><p>  makeWord(n,temp);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  if (match != true)</p>

25、<p><b>  {</b></p><p>  makeWord(21,temp);</p><p><b>  }</b></p><p>  }else if (isdigit(ch)) //識別數(shù)字</p><p><

26、b>  {</b></p><p>  temp[i] = ch;</p><p>  this->forward();</p><p>  ch = buffer[cur];</p><p>  while(isdigit(ch))</p><p><b>  {</b>

27、</p><p><b>  i++;</b></p><p>  temp[i] = ch;</p><p>  this->forward();</p><p>  ch = buffer[cur];</p><p><b>  }</b></p>&

28、lt;p>  this->back();</p><p><b>  i++;</b></p><p>  temp[i] = '\0';</p><p>  makeWord(22,temp);</p><p>  }else if (ch == '+' || ch == &

29、#39;-' || ch == '*' || ch == '/' || ch == '=' || ch == '<' ) //識別算符</p><p><b>  {</b></p><p>  switch(ch)</p><p><b>  {<

30、;/b></p><p>  case '+': makeWord(8,"+");break;</p><p>  case '-': makeWord(9,"-");break;</p><p>  case '*':makeWord(10,"*");

31、break;</p><p>  case '/':makeWord(11,"/");break;</p><p>  case '=':makeWord(12,"=");break;</p><p>  case '<':makeWord(13,"<&qu

32、ot;);break;</p><p><b>  }</b></p><p>  }else if(ch == ':')</p><p><b>  {</b></p><p>  this->forward();</p><p>  ch = buf

33、fer[cur];</p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  makeWord(14,":=");</p><p><b>  }else{</b></p><p>  E

34、rror("非法符號");//出錯 非法符號</p><p><b>  }</b></p><p>  }else if (ch == '(')</p><p><b>  {</b></p><p>  push('(');</p>

35、<p>  makeWord(16,"(");</p><p>  }else if ( ch == ')')</p><p><b>  {</b></p><p>  if (isMatch(')'))</p><p><b>  {<

36、/b></p><p>  makeWord(17,")");</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if( ch == '{'){</p><p>  push

37、('{');</p><p>  ls = new struct word;</p><p>  ls->id = length;</p><p>  ls->line = line;</p><p>  ls->type = 18;</p><p>  strcpy(ls->c

38、ontent, "{");</p><p>  ls->next = NULL;</p><p>  if(head == NULL)</p><p><b>  {</b></p><p><b>  le = ls;</b></p><p>  

39、head = le;</p><p><b>  }else</b></p><p>  le->next = ls;</p><p><b>  le = ls;</b></p><p><b>  length++;</b></p><p> 

40、 }else if ( ch == '}')</p><p><b>  {</b></p><p>  if (isMatch('}')) //已做錯誤處理</p><p><b>  {</b></p><p>  makeW

41、ord(17,"}");</p><p><b>  }</b></p><p>  }else if ( ch == '#' )</p><p><b>  {</b></p><p>  makeWord(20,"#");</p>

42、;<p>  }else if ( ch == ';')</p><p><b>  {</b></p><p>  makeWord(15,";");</p><p><b>  }</b></p><p>  else if ( ch == &#

43、39; ' || ch == '\t' || ch == '\r' || ch == '\f')</p><p><b>  {</b></p><p>  }else if( ch == '\n' )</p><p><b>  {</b></

44、p><p>  this->line++;</p><p><b>  }else{</b></p><p>  Error("非法符號");</p><p><b>  }</b></p><p><b>  }</b></

45、p><p>  void CiFa::shapeWord(int type, char *content ) //構(gòu)造單詞</p><p><b>  {</b></p><p>  ls = new struct word;</p><p>  ls->id = length;</p><

46、p>  ls->line = line;</p><p>  ls->type = type;</p><p>  strcpy(ls->content, content);</p><p>  ls->next = NULL;</p><p>  if(head == NULL)</p><

47、p><b>  {</b></p><p><b>  le = ls;</b></p><p>  head = le;</p><p><b>  }else</b></p><p>  le->next = ls;</p><p>&l

48、t;b>  le = ls;</b></p><p><b>  length++;</b></p><p><b>  }</b></p><p>  void CiFa::Error(char *content) //錯誤的定位</p><p><b>  {

49、</b></p><p>  els = new struct error;</p><p>  els->id = elength;</p><p>  els->line = line;</p><p>  strcpy(els->reason, content);</p><p> 

50、 els->next = NULL;</p><p>  if(ehead == NULL)</p><p><b>  {</b></p><p>  ele = els;</p><p>  ehead = ele;</p><p><b>  }else</b>&

51、lt;/p><p>  ele->next = els;</p><p>  ele = els;</p><p>  elength++;</p><p><b>  }</b></p><p>  struct word* CiFa::getWord() //獲得單詞</p&g

52、t;<p><b>  {</b></p><p>  return this->head;</p><p><b>  }</b></p><p>  bool CiFa::hasError() //看是否有錯誤</p><p><b>  {</b

53、></p><p>  if (ehead ==NULL)</p><p><b>  {</b></p><p>  return false;</p><p><b>  }else{</b></p><p>  return true;</p>&l

54、t;p><b>  }</b></p><p><b>  }</b></p><p>  進(jìn)行語法分析的部分代碼:</p><p>  mytiny::mytiny(struct word* head)</p><p><b>  {</b></p>&l

55、t;p>  this->head = head; //代入</p><p>  start = 0;</p><p>  end = getNum();</p><p><b>  cur = 0;</b></p><p>  this->print = false;<

56、;/p><p><b>  //常量</b></p><p>  printf("\n\n\n語法分析開始\n:....................");</p><p>  this->phead = this->program();</p><p>  if (phead != NUL

57、L)</p><p><b>  {</b></p><p>  //printf("\n%s\n",phead->date);</p><p>  show(phead,0);</p><p><b>  }</b></p><p>  pri

58、ntf("\n語法分析結(jié)束\n:........................");</p><p><b>  }</b></p><p>  struct yufatree* mytiny::program()</p><p><b>  {</b></p><p>  s

59、truct yufatree* p;</p><p>  p = new struct yufatree;</p><p>  if (cur<end)</p><p><b>  {</b></p><p>  int type = head->type; //每個單詞的總

60、類</p><p>  if (type == 0||type == 4||type == 6||type == 7||type == 21)</p><p><b>  {</b></p><p>  p->date = "Program";</p><p>  initLeaves(p);

61、</p><p>  p->leave[0] = stmt_sequence();</p><p><b>  return p;</b></p><p><b>  }else {</b></p><p>  printf("程序不接受參數(shù)(行數(shù):%3d):%5s\t!\n&quo

62、t;,head->line,head->content);</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  }else{</b></p><p>  return NULL;</p>

63、;<p><b>  }</b></p><p><b>  }</b></p><p>  struct yufatree* mytiny::stmt_sequence()</p><p><b>  {</b></p><p>  struct yufatre

64、e* p;</p><p>  p = new struct yufatree;</p><p>  p->date = "stmt-sequence";</p><p>  this->initLeaves(p);</p><p>  if (cur<end)</p><p>&

65、lt;b>  {</b></p><p>  int type = getWord(cur)->type;</p><p>  if (type == IF|| type == REPEAT|| type==IDENTIFIER||type == READ||type == WRITE)</p><p><b>  {</b&

66、gt;</p><p>  p->leave[0] = statement();</p><p>  p->leave[1] = stmt_sequence2();</p><p>  if (cur<end)</p><p><b>  {</b></p><p>  type

67、 = getWord(cur)->type;</p><p>  if (type == 15||type == END|| type == ELSE ||type == UNTIL)</p><p><b>  {</b></p><p><b>  return p;</b></p><p&

68、gt;<b>  }else{</b></p><p>  printf("error");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  }else{</b>

69、</p><p><b>  return p;</b></p><p><b>  }</b></p><p><b>  }else{</b></p><p>  printf("error");</p><p><b&

70、gt;  exit(0);</b></p><p><b>  } </b></p><p><b>  }else{</b></p><p>  printf("stmt_sequence");</p><p><b>  exit(0);</b&g

71、t;</p><p><b>  }</b></p><p><b>  }</b></p><p>  struct yufatree* mytiny::stmt_sequence2()</p><p><b>  {</b></p><p>  st

72、ruct yufatree* p;</p><p>  p = new struct yufatree;</p><p>  p->date = "stmt-sequence2";</p><p>  initLeaves(p);</p><p>  if (cur < end)</p><

73、p><b>  {</b></p><p>  if (getWord(cur)->type == 15)</p><p><b>  {</b></p><p>  p->leave[0] = saveTerminal();</p><p>  p->leave[1] =

74、statement();</p><p>  p->leave[2] = stmt_sequence2();</p><p>  if (cur<end)</p><p><b>  {</b></p><p>  int type = getWord(cur)->type;</p>&l

75、t;p>  if (type != 15)</p><p><b>  {</b></p><p>  printf("error");</p><p><b>  exit(0);</b></p><p><b>  }</b></p>

76、<p><b>  }else{</b></p><p><b>  return p;</b></p><p><b>  }</b></p><p>  }else{ //stmt-sequence->ko

77、ng</p><p>  return NULL;</p><p><b>  }</b></p><p><b>  }else</b></p><p>  return NULL;</p><p><b>  }</b></p><

78、;p>  struct yufatree* mytiny::statement()</p><p><b>  {</b></p><p>  struct yufatree* p;</p><p>  p = new struct yufatree;</p><p>  p->date = "st

79、atement";</p><p>  this->initLeaves(p);</p><p>  if (cur < end)</p><p><b>  {</b></p><p>  int type = getWord(cur)->type;</p><p>

80、  switch(type)</p><p><b>  {</b></p><p><b>  //if-stmt</b></p><p>  case 0:p->leave[0] = if_stmt();break;</p><p>  //repeat-stmt</p>

81、<p>  case 4:p->leave[0] = repeat_stmt();break;</p><p>  //read-stmt</p><p>  case 6:p->leave[0] = read_stmt();break;</p><p>  //write-stmt</p><p>  case 7:p

82、->leave[0] = write_stmt();break;</p><p>  //assign-stmt</p><p>  case 21:p->leave[0] =assign_stmt();break;</p><p>  case 15:return p;</p><p>  default:return NU

83、LL;</p><p><b>  }</b></p><p><b>  return p;</b></p><p><b>  }else{</b></p><p>  printf("statement ");</p><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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論