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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  編譯原理課程設計報告</p><p>  課題名稱: C-編譯器詞法分析與語法分析的實現(xiàn) </p><p>  指導教師評閱成績: </p><p>  指導教師評閱意見: </p><p>

2、  . </p><p>  . </p><p>  提交報告時間:2013年 6 月 5 日</p><p>  編譯原理課程設計報告1</p><p

3、>  1、課程設計目標3</p><p><b>  2、分析與設計3</b></p><p>  2.1、說明所用的方法:3</p><p>  2.2、系統(tǒng)總圖:3</p><p>  2.2.1、scanner部分:3</p><p>  2.2.2、parse部分:5&l

4、t;/p><p>  2.2.3、代碼設計說明7</p><p>  3、程序代碼實現(xiàn)10</p><p>  3.1、獲取輸入部分(在main.c中):10</p><p>  3.2、詞法分析部分(在scan.c中):10</p><p>  3.3、語法分析部分(在parse.c中):15</p>

5、;<p>  3.4、輸出與結點的建立(在util.c中)29</p><p>  3.5、TokenType、treeNode與結點類型的聲明(在globals.h中)34</p><p><b>  4、測試結果36</b></p><p><b>  5、總結36</b></p>

6、<p><b>  5.1、收獲36</b></p><p><b>  5.2、不足36</b></p><p><b>  1、課程設計目標</b></p><p>  本次實驗,本C- 編譯器主要設計并且實現(xiàn)了C- 編譯器的詞法分析功能與語法分析功能。</p><

7、;p><b>  2、分析與設計</b></p><p>  2.1、說明所用的方法:</p><p>  各部分的實現(xiàn)方法(scanner:手工實現(xiàn)、Lex;parser:遞歸下降、LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)、Yacc),所用編程語言</p><p><b>  2.2、系統(tǒng)總圖:<

8、/b></p><p>  2.2.1、scanner部分:</p><p>  2.2.1.1、實驗原理:</p><p>  掃描程序的任務是從源代碼中讀取字符并形成由編譯器的以后部分(通常是分析程序)處理的邏輯單元。由掃描程序生成的邏輯單元稱作記號(token),將字符組合成記號與在一個英語句子中將字母將字母構成單詞并確定單次的含義很相像。</p&

9、gt;<p>  在此程序中,我將記號分成了以下類型:</p><p>  typedef enum {//按照書上附錄B程序布局,放在globals.h中</p><p>  ENDFILE,ERROR,</p><p>  IF,ELSE,INT,RETURN,VOID,WHILE,</p><p><b>  I

10、D,NUM,</b></p><p>  ASSIGN,PLUS,MINUS,TIMES,OVER,LT,LET,BT,BET,EQ,NEQ,</p><p>  // = + - * / < <= > >= == != </p><p>  LPAREN_1,RPAREN_1,S

11、EMI,COM,LPAREN_2,RPAREN_2,LPAREN_3,RPAREN_3,LIN,RIN</p><p>  //{ } ; , [ ] ( ) /* </p><p>  } TokenType;</p><p>  其中,關鍵字有:else、if、in

12、t、return、void、while;</p><p>  專用符號有:+、-、*、/、<、<=、>、>=、==、~=、=、;、,、(、)、[、]、{、}、/*、*/</p><p>  其他標記是ID、NUM,通過下列正則表達式定義:</p><p>  ID = letter letter*</p><p>

13、  NUM = digit digit*</p><p>  letter = a|..|z|A|..|Z</p><p>  digit = 0|..|9</p><p>  小寫大寫字母是有區(qū)別的。</p><p>  空格由空白、換行符和制表符組成。空格通常被忽略,除了他必須分開ID、NUM關鍵字。</p><p&g

14、t;  注釋常用通常的C語言符號/*...*/圍起來。注釋可以放在任何空白出現(xiàn)的位置(即注釋不能放在標記內)上,且可以超過一行。注釋不能嵌套。</p><p>  2.2.1.2、實驗方法:</p><p>  我通過對scanner部分原理的了解,確定了他的NFA,再將NFA轉化成DFA,并且將狀態(tài)數(shù)最小化。最后根據我所得的DFA與課后TINY的示例程序編寫scanner.c。</

15、p><p><b>  最后所得的DFA:</b></p><p>  2.2.1.3、編程方法:</p><p><b>  編程采用C語言。</b></p><p>  初始狀態(tài)設置為START,當需要得到下一個token時,取得此token的第一個字符,并且按照DFA與對此字符的類型的分析,轉換狀

16、態(tài)。重復此步驟,直到DONE為止,輸出token類型。</p><p>  此中難點在于對于注釋的分析,因此我將判斷注釋分成幾個步驟。當字符為“/”時,狀態(tài)轉換為INASSIGN_1(自創(chuàng)的)再判斷下一個字符,如果為“*”則是注釋,如果是其他的則字符停滯與當前字符(ungetNextChar()),并且輸出“/”。在開始時一直未注意停滯與當前字符,因此總是讀不出“/v*”中的“v”,在調試多次后才得以解決。<

17、;/p><p>  2.2.2、parse部分:</p><p>  2.2.2.1、實驗原理:</p><p>  C-語言的各個語法規(guī)則: </p><p>  1. program → declaration-list </p><p>  2. declaration-list → declaration-list

18、 declaration | declaration </p><p>  3. declaration → var-declaration | fun-declaration </p><p>  4. var-declaration → type-specifier ID ; | type-specifier ID [ NUM ] ; </p><p>  5.

19、 type-specifier → int | void </p><p>  6. fun-declaration → type-specifier ID ( params ) compound-stmt (在課后解釋中compound-stmt前面沒有“|”符號) </p><p>  7. params → params-list | void </p><p&

20、gt;  8. param-list → param-list , param | param </p><p>  9. param → type-specifier ID | type-specifier ID [ ] </p><p>  10. compound-stmt → { local-declarations statement-list } </p><

21、;p>  11. local-declarations → local-declarations var-declaration | empty </p><p>  12. statement-list → statement-list statement | empty </p><p>  13. statement → expression-stmt | compound-s

22、tmt | selection-stmt | </p><p>  iteration-stmt | return-stmt </p><p>  14. expression-stmt → expression ; | ; </p><p>  15. selection-stmt → if ( expression ) statement | if ( expr

23、ession ) </p><p>  statement else statement </p><p>  16. iteration-stmt → while(expression) statement </p><p>  17. return-stmt → return ; | return expression ; </p><p&g

24、t;  18. expression → var = expression | simple-expression </p><p>  19. var → ID | ID [ expression ] </p><p>  20. simple-expression → additive-expression relop additive-expression | </p>

25、<p>  additive-expression </p><p>  21. relop → <= | < | > | >= | == | != </p><p>  22. additive-expression → additive-expression addop term | term </p><p>  23. a

26、ddop → + | - </p><p>  24. term → term mulop factor | factor </p><p>  25. mulop → * | / </p><p>  26. factor → ( expression ) | var | call | NUM </p><p>  27. call → I

27、D ( args ) </p><p>  28. args → arg-list | empty </p><p>  29. arg-list → arg-list , expression | expression </p><p>  2.2.2.2、實驗方法:</p><p>  本次試驗完成parse方法我采用的是遞歸下降的方法。

28、根據C- 語言的規(guī)則,我們可以得出C- 語言語法的EBNF。下面是我在代碼中所使用的自己整理出來的語法規(guī)則:</p><p>  注:{ }為重復[ ]為選擇,{}為本來的意思</p><p>  1. program → declaration-list </p><p>  2. declaration-list → declaration { declarat

29、ion }</p><p>  3. declaration → int|void|empty ID [factor];| (params)compound-stmt</p><p>  4. params → params-list | void </p><p>  5. param-list → param { param }</p><

30、;p>  6. param → int|void ID empty|[] </p><p>  7. compound-stmt → { local-declarations statement-list } </p><p>  8. local-declarations → { declaration }|empty</p><p>  9. stat

31、ement-list → { statement }|empty </p><p>  10. statement → expression-stmt | compound-stmt | selection-stmt | </p><p>  iteration-stmt | return-stmt </p><p>  11. expression-stmt →

32、expression ; | ; </p><p>  12. selection-stmt → if ( expression ) statement { else statement }</p><p>  13. iteration-stmt → while(expression) statement </p><p>  14. return-stmt →

33、return ;|expression ; </p><p>  15. expression → simple-expression { = expression }</p><p>  16. var → ID [ [ expression ] ] </p><p>  17. simple-expression → additive-expression {

34、 relop additive-expression }</p><p>  18. relop → <= | < | > | >= | == | != </p><p>  19. additive-expression → additive-expression { addop term } </p><p>  20. addop →

35、+ | - </p><p>  21. term → term mulop { factor } </p><p>  22. mulop → * | / </p><p>  23. factor → ( expression ) | NUM | ID (args)|[expression]|empty</p><p>  24.

36、 args → arg-list | empty </p><p>  25. arg-list → expression{ expression } </p><p>  其中,3條declaration15條expression和23條factor是重點修改內容。</p><p>  2.2.2.3、編程方法:</p><p><b

37、>  編程采用C語言。</b></p><p>  分析從program開始,逐層向下擴展。依靠下一步所得到的token,根據整理過后的語法規(guī)則來判斷語法樹的結點生成與走向。并且根據語法規(guī)則來確定語法樹的末結點的內容。</p><p>  此處的難點在于語法規(guī)則的整理。若是按照書上原來的29條語法規(guī)則來寫,就會發(fā)現(xiàn)在樹的生成方法與邏輯上會很難實現(xiàn)。最開始時我便參照著原29

38、條語法規(guī)則來寫的,雖然全程序都沒有報錯,但是分析程序時一直分析不了。最后停下編程來從筆頭整理了一陣子語法規(guī)則后,語法分析程序可以分析了,只有個別錯誤了。再不斷地在每一個結點生成時fprintf(listing,”\n-------its XXXX time\n”)一下,逐步排查錯誤,最終才確定了剩下的這25個語法規(guī)則。</p><p>  2.2.3、代碼設計說明</p><p>  程序

39、globals files包里面分為Source Files文件夾和Header Files文件夾</p><p>  Source Files文件夾中包含:main.c ;parse.c ;scan.c ;util.c</p><p>  Header Files文件夾中包含:globals.h ;parse.h ;scan.h ;util.h</p><

40、p><b>  其中:</b></p><p>  main.c負責程序的執(zhí)行方式(cmd命令行下執(zhí)行globals.exe +測試代碼文件名)</p><p>  globals.h負責treeNode的聲明,TokenType類型的聲明,與NodeKind等的聲明</p><p>  util.c負責新結點的構造,詞法的輸出,語法的輸

41、出,以及輸出顯示的布局</p><p>  void printToken( TokenType token, const char * tokenString) {}</p><p>  //根據書上原型做的,但根據語法規(guī)則所需要的,做過大量修改</p><p>  TreeNode * newStmtNode(StmtKind kind) {}</p>

42、;<p>  //根據書上原型做的,未經修改</p><p>  TreeNode * newExpNode(ExpKind kind) {}</p><p>  //根據書上原型做的,未經修改</p><p>  TreeNode * newParamNode(void) {}</p><p>  //自己根據所需建立<

43、/p><p>  TreeNode * newDecNode(void) {}</p><p>  //自己根據所需建立</p><p>  char * copyString(char * s) {}</p><p>  //根據書上原型做的,未經修改</p><p>  static void printSpaces(

44、void) {}</p><p>  //根據書上原型做的,未經修改</p><p>  void printTree( TreeNode * tree ){}</p><p>  //根據書上原型做的,但根據語法規(guī)則所需要的,做過大量修改</p><p>  util.h負責util.c中所用函數(shù)的聲明</p><p&g

45、t;  scan.c負責詞法狀態(tài)的聲明,詞法的分析</p><p>  typedef enum {START,INASSIGN_1,L_ASSIGN,R_ASSIGN,</p><p>  E_ASSIGN,N_ASSIGN,INASSIGN_2,INCOMMENT,</p><p>  INNUM,INID,DONE} StateType;</p>

46、<p>  //根據書上原型做的,但根據語法規(guī)則所需要的,做過大量修改</p><p>  static int getNextChar(void) {}</p><p>  //根據書上原型做的,未經修改</p><p>  static void ungetNextChar(void) {}</p><p>  //根據書上原

47、型做的,未經修改</p><p>  static struct {char* str;TokenType tok;} reservedWords[MAXRESERVED] = </p><p>  {"if",IF},{"else",ELSE},{"int",INT},{"return",RETURN},{

48、"void",VOID},{"while",WHILE}};</p><p>  //根據書上原型做的,但根據語法規(guī)則所需要的,做過大量修改</p><p>  static TokenType reservedLookup (char * s) {}</p><p>  //根據書上原型做的,未經修改</p>

49、<p>  TokenType getToken(void) {}</p><p>  //根據書上原型做的,但根據語法規(guī)則所需要的,做過大量修改</p><p>  scan.h負責對scan.c中所用函數(shù)的聲明</p><p>  parse.c負責語法樹的分析</p><p>  static void syntaxError

50、(char * message) {}</p><p>  //根據書上原型做的,未經修改</p><p>  static void match(TokenType expected) {}</p><p>  //根據書上原型做的,未經修改</p><p>  //以下的全部為自己所寫</p><p>  stat

51、ic TreeNode * program(void);</p><p>  static TreeNode * declaration_list(void);</p><p>  static TreeNode * declaration(void);</p><p>  static TreeNode * params(void);<

52、/p><p>  static TreeNode * param_list(void);</p><p>  static TreeNode * param(void);</p><p>  static TreeNode * compound_stmt(void);</p><p>  static TreeNode * local_

53、declaration(void);</p><p>  static TreeNode * statement_list(void);</p><p>  static TreeNode * statement(void);</p><p>  static TreeNode * expression_stmt(void);</p>&l

54、t;p>  static TreeNode * selection_stmt(void);</p><p>  static TreeNode * iteration_stmt(void);</p><p>  static TreeNode * return_stmt(void);</p><p>  static TreeNode * expr

55、ession(void);</p><p>  static TreeNode * var(void);</p><p>  static TreeNode * simple_expression(void);</p><p>  static TreeNode * additive_expression(void);</p>&l

56、t;p>  static TreeNode * term(void);</p><p>  static TreeNode * factor(void);</p><p>  static TreeNode * args(void);</p><p>  static TreeNode * arg_list(void);</p>&

57、lt;p>  parse.h負責parse.c中所用函數(shù)的聲明</p><p>  此次所做程序輸入格式為:</p><p>  cmd命令行下執(zhí)行globals.exe +測試代碼文件名</p><p><b>  輸出地方:</b></p><p><b>  cmd命令行</b><

58、/p><p><b>  輸出內容:</b></p><p><b>  詞法分析與語法樹</b></p><p><b>  3、程序代碼實現(xiàn)</b></p><p>  3.1、獲取輸入部分(在main.c中):</p><p>  此處因為并未有所修改

59、,均參照附錄B所寫,所以略去。</p><p>  3.2、詞法分析部分(在scan.c中):</p><p>  其中部分代碼因為參照附錄B中內容而未修改,所以略去。</p><p>  typedef enum {//此處便如2.2.1.2圖所示,定義11個中間狀態(tài),其中INASSIGN分成了L_ASSIGN,R_ASSIGN,而在分析注釋結束時添加了INASS

60、IGN_2狀態(tài)</p><p>  E_ASSIGN,N_ASSIGN,</p><p>  START,INASSIGN_1,L_ASSIGN,R_ASSIGN,</p><p>  E_ASSIGN,N_ASSIGN,INASSIGN_2,INCOMMENT,</p><p>  INNUM,INID,DONE</p>&l

61、t;p>  } StateType;</p><p>  static struct {char* str;TokenType tok;} reservedWords[MAXRESERVED] = </p><p>  {{"if",IF},{"else",ELSE},{"int",INT},{"return&

62、quot;,RETURN},{"void",VOID},{"while",WHILE}};//此處根據C- 的保留字做了一定的修改</p><p>  TokenType getToken(void) {//獨立完成</p><p>  int tokenStringIndex = 0;</p><p>  TokenTyp

63、e currentToken;</p><p>  StateType state = START;</p><p><b>  int save;</b></p><p>  while (state !=DONE) {</p><p>  int c = getNextChar();</p><p

64、>  save = TRUE;</p><p>  //fprintf(listing,"\nScanner: state = %d\n",state);//測試每一步狀態(tài)</p><p>  switch (state) {</p><p>  case START:</p><p>  if(isdigit(c)

65、)</p><p>  state = INNUM;//是數(shù)字</p><p>  else if(isalpha(c))</p><p>  state = INID;//是ID</p><p>  //fprintf(listing,"\n--is alpha\n");}//測試是否進行到此處</p>

66、<p>  else if(c == '/') {</p><p>  save = FALSE;</p><p>  state = INASSIGN_1;//判斷注釋</p><p>  //fprintf(listing,"\n--is /\n");</p><p><b&g

67、t;  }</b></p><p>  else if((c == ' ') || (c == '\t') || (c == '\n'))</p><p>  save = FALSE;</p><p>  else if(c == '<') {</p><p>

68、;  save = FALSE;</p><p>  state = L_ASSIGN;</p><p><b>  }</b></p><p>  else if(c == '>') {</p><p>  save = FALSE;</p><p>  state = R

69、_ASSIGN;</p><p><b>  }</b></p><p>  else if(c == '=') {</p><p>  save = FALSE;</p><p>  state = E_ASSIGN;</p><p><b>  }</b>

70、</p><p>  else if(c == '!') {</p><p>  save = FALSE;</p><p>  state = N_ASSIGN;</p><p><b>  }</b></p><p><b>  else {</b><

71、;/p><p>  state = DONE;</p><p>  switch(c) {</p><p><b>  case EOF:</b></p><p>  save = FALSE;</p><p>  currentToken = ENDFILE;</p><p>

72、;<b>  break;</b></p><p><b>  case ',':</b></p><p>  currentToken = COM;</p><p><b>  break;</b></p><p><b>  case '=

73、':</b></p><p>  currentToken = EQ;</p><p><b>  break;</b></p><p><b>  case '+':</b></p><p>  currentToken = PLUS;</p>&

74、lt;p><b>  break;</b></p><p><b>  case '-':</b></p><p>  currentToken = MINUS;</p><p><b>  break;</b></p><p><b>  ca

75、se '*':</b></p><p>  currentToken = TIMES;</p><p><b>  break;</b></p><p><b>  case '(':</b></p><p>  currentToken = LPAREN

76、_3;</p><p><b>  break;</b></p><p><b>  case ')':</b></p><p>  currentToken = RPAREN_3;</p><p><b>  break;</b></p><

77、;p><b>  case '[':</b></p><p>  currentToken = LPAREN_2;</p><p><b>  break;</b></p><p><b>  case ']':</b></p><p> 

78、 currentToken = RPAREN_2;</p><p><b>  break;</b></p><p><b>  case '{':</b></p><p>  currentToken = LPAREN_1;</p><p><b>  break;<

79、;/b></p><p><b>  case '}':</b></p><p>  currentToken = RPAREN_1;</p><p><b>  break;</b></p><p><b>  case ';':</b>

80、</p><p>  currentToken = SEMI;</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  currentToken = ERROR;</p><p><b>  bre

81、ak;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p>  case INCOMMENT:</p><p>  save = FALSE

82、;</p><p>  if (c == EOF) {</p><p>  state = DONE;</p><p>  currentToken = ENDFILE;</p><p><b>  }</b></p><p>  else if (c=='*') state =

83、INASSIGN_2;//判斷 出 注釋</p><p>  else state = INCOMMENT;</p><p><b>  break;</b></p><p>  case INASSIGN_1:</p><p>  if (c == '*') {</p><p>

84、  //fprintf(listing,"\n--is zs\n");</p><p>  save = FALSE;</p><p>  state = INCOMMENT;//是注釋</p><p><b>  }</b></p><p><b>  else {</b>&

85、lt;/p><p>  state = DONE;</p><p>  ungetNextChar();//char停住,否則會令“/”號后面的char讀不出來</p><p>  currentToken = OVER;</p><p><b>  }</b></p><p><b>  

86、break;</b></p><p>  case INASSIGN_2:</p><p>  if (c == '/') {//是 出 注釋</p><p>  save = FALSE;</p><p>  state = START;</p><p><b>  }</

87、b></p><p>  else state = INCOMMENT;//不是,返回注釋</p><p><b>  break;</b></p><p>  case L_ASSIGN:</p><p>  if(c == '=') </p><p>  currentT

88、oken = LET;</p><p>  else currentToken = LT;</p><p>  state = DONE;</p><p><b>  break;</b></p><p>  case R_ASSIGN:</p><p>  if(c == '='

89、) </p><p>  currentToken = BET;</p><p>  else currentToken = BT;</p><p>  state = DONE;</p><p><b>  break;</b></p><p>  case E_ASSIGN:</p>

90、;<p>  if(c == '=') </p><p>  currentToken = EQ;</p><p>  else currentToken = ASSIGN;</p><p>  state = DONE;</p><p><b>  break;</b></p>

91、<p>  case N_ASSIGN:</p><p>  if(c == '=') </p><p>  currentToken = NEQ;</p><p>  else ungetNextChar();</p><p>  state = DONE;</p><p><b&

92、gt;  break;</b></p><p>  case INNUM:</p><p>  if (!isdigit(c)) {</p><p>  ungetNextChar();</p><p>  save = FALSE;</p><p>  state = DONE;</p>&

93、lt;p>  currentToken = NUM;</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case INID:</p><p>  if (!isalpha(c)) {</p><p>  //

94、fprintf(listing,"\n--is ID over\n");</p><p>  ungetNextChar();</p><p>  save = FALSE;</p><p>  state = DONE;</p><p>  currentToken = ID;</p><p>&

95、lt;b>  }</b></p><p><b>  break;</b></p><p>  case DONE:</p><p><b>  default:</b></p><p>  fprintf(listing,"Scanner Bug: state = %d

96、\n",state);</p><p>  state = DONE;</p><p>  currentToken = ERROR;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  //fprintf

97、(listing,"out switch");</p><p>  //getchar();</p><p>  if ((save) && (tokenStringIndex <= MAXTOKENLEN))</p><p>  tokenString[tokenStringIndex++] = (char) c;<

98、;/p><p>  if (state == DONE) {</p><p>  tokenString[tokenStringIndex] = '\0';</p><p>  if(currentToken == ID)</p><p>  currentToken = reservedLookup(tokenString);&

99、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  if (TraceScan) {</p><p>  fprintf(listing,"\n%d: ",lineno);</p><p>  printTo

100、ken(currentToken,tokenString);</p><p><b>  }</b></p><p>  return currentToken;</p><p><b>  }</b></p><p>  3.3、語法分析部分(在parse.c中):</p><

101、p>  其中部分代碼因為參照附錄B中內容而未修改,所以略去。</p><p>  TreeNode * stmt_program(void) {</p><p>  //program -> declaration-list</p><p>  TreeNode * t = declaration_list();</p><p>

102、<b>  return t;</b></p><p><b>  }</b></p><p>  TreeNode * declaration_list(void) {</p><p>  //declaration-list -> declaration-list declaration | declarati

103、on</p><p>  // declaration{declaration}</p><p>  TreeNode * t = NULL;</p><p>  TreeNode * p = NULL;</p><p>  TreeNode * q = NULL;</p><p>  //fprintf(li

104、sting,"\n------------------------its dec_li time\n");</p><p>  //fprintf(listing,"\n+++++%s+++++\n",tokenString);//此兩處語句用于程序最初的運行測試,基本上每一個函數(shù)里都有,用來測試哪一步有問題</p><p>  if(token!

105、=ENDFILE&&(token==INT||token==VOID)) {</p><p>  t = declaration();</p><p><b>  p = t;</b></p><p>  while (token!=ENDFILE&&(token==INT||token==VOID)) {<

106、;/p><p>  q = declaration();</p><p>  if(q!=NULL) {</p><p>  if(t == NULL) t = p = q;</p><p><b>  else {</b></p><p>  p->sibling = q;</p>

107、<p><b>  p = q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

108、<p><b>  return t;</b></p><p><b>  }</b></p><p>  TreeNode * declaration(void) {</p><p>  //declaration -> var-declaration | fun-declaration

109、</p><p>  // (int|void) ID [[NUM]]; | ((int|void) ID (params) compound-stmt)</p><p>  // int a[]; | int a; | void a?;| void main (void) | int gcd (int a[],int b) | { {var-declaration} {sta

110、tement(if,while...)} }//此處曾糾結過很久,最后發(fā)現(xiàn)附錄A開始陳列29條語法部分和后來詳解29條語法時有不同的地方。compound-stmt前面的“|”沒了。。。十分無語。而且這里是個難點。我發(fā)現(xiàn)如果真的有var-declaration那些東西又麻煩又累贅,就去掉了幾句語法</p><p>  //&&var-declaration&&type_specif

111、ier&&fun_declaration</p><p>  TreeNode * t = newDecNode();</p><p>  //fprintf(listing,"\n------------------------its dec time\n");</p><p>  //fprintf(listing,&qu

112、ot;\n+++++%s+++++\n",tokenString);</p><p>  switch(token) {</p><p><b>  case INT:</b></p><p>  t -> attr.type = "int";</p><p>  match(INT)

113、;</p><p><b>  break;</b></p><p>  case VOID:</p><p>  t -> attr.type = "void";</p><p>  match(VOID);</p><p><b>  break;</

114、b></p><p><b>  case EOF:</b></p><p><b>  return t;</b></p><p><b>  default:</b></p><p>  syntaxError("unexpected token in Ty

115、pe-> ");</p><p>  printToken(token,tokenString);</p><p>  token = getToken();</p><p><b>  break;</b></p><p><b>  }</b></p><p&

116、gt;  // fprintf(listing,"\n+++++%s+++++\n",tokenString);</p><p>  t -> attr.name = copyString(tokenString);</p><p>  match(ID);</p><p>  // fprintf(listing,"

117、;\n+++++%s+++++\n",tokenString);</p><p>  switch(token) {</p><p>  case LPAREN_2:</p><p>  t -> kind.dec = ArrayK;</p><p>  t -> child[0] = factor();</p&g

118、t;<p>  match(RPAREN_2);</p><p>  match(SEMI);</p><p><b>  break;</b></p><p>  case SEMI:</p><p>  t -> kind.dec = VarK;</p><p>  mat

119、ch(SEMI);</p><p><b>  break;</b></p><p>  case LPAREN_3:</p><p>  match(LPAREN_3);</p><p>  //fprintf(listing,"\n+++++%s+++++\n",tokenString);&l

120、t;/p><p>  t -> kind.dec = FunK;</p><p>  if(t!=NULL) t->child[0] = params();</p><p>  match(RPAREN_3);</p><p>  // fprintf(listing,"\n+++++%s+++++\n",

121、tokenString);</p><p>  if(t!=NULL) t->child[1] = compound_stmt();</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  syntaxError("

122、declaration wrong");</p><p>  token = getToken();</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  return t;</b></p>

123、<p><b>  }</b></p><p>  TreeNode * params(void) {</p><p>  TreeNode * t = newParamNode();</p><p>  //fprintf(listing,"\n------------------------its par time\

124、n");</p><p>  //fprintf(listing,"\n+++++%s+++++\n",tokenString);</p><p>  switch(token) {</p><p>  case VOID:</p><p>  t ->attr.type = copyString(tok

125、enString);</p><p>  match(VOID);</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  t -> kind.param = UNull;</p><p>  t -&

126、gt;child[0] = param_list();</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  }</b></p&g

127、t;<p>  TreeNode * param_list(void) {</p><p>  TreeNode * t = param();</p><p>  TreeNode * p = t;</p><p>  //fprintf(listing,"\n------------------------its par_l time\n

128、");</p><p>  //fprintf(listing,"\n+++++%s+++++\n",tokenString);</p><p>  while ( (token != RPAREN_3) && ( token != ENDFILE )) {</p><p>  TreeNode * q;</p&

129、gt;<p>  match(COM);</p><p>  q = param();</p><p>  if (q != NULL) {</p><p>  if (t == NULL) t = p = q;</p><p><b>  else {</b></p><p>  

130、p->sibling = q;</p><p><b>  p = q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

131、b>  return t;</b></p><p><b>  }</b></p><p>  TreeNode * param(void) {</p><p>  TreeNode * t = newParamNode();//這是參數(shù)結點,區(qū)別與聲明結點</p><p>  //fprintf(l

溫馨提示

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

評論

0/150

提交評論