CMinus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)報告書_第1頁
CMinus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)報告書_第2頁
CMinus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)報告書_第3頁
CMinus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)報告書_第4頁
CMinus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)報告書_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、編譯原理課程設(shè)計(jì)報告課題名稱:名Minus詞法分析和語法分析設(shè)計(jì)提交文檔學(xué)生姓名:XXX提交文檔學(xué)生學(xué)號:XXXXXXXXXX同組成員名單:XXX指導(dǎo)教師姓名: X X指導(dǎo)教師評閱成績:指導(dǎo)教師評閱意見:提交報告時間:2015年6月10日1.課程設(shè)計(jì)目標(biāo)實(shí)驗(yàn)建立C-編譯器。只含有掃描程序(scanner )和語法分析(parser)部分。2.分析與設(shè)計(jì)C-編譯器設(shè)計(jì)的整體框架,本實(shí)驗(yàn)實(shí)現(xiàn)掃描處理和語法分析程序(圖中粗黑部分)。2.1、 掃描程序scanner部分2.1.1 系統(tǒng)設(shè)計(jì)思想設(shè)計(jì)思想:根據(jù)DFA圖用switch-case結(jié)構(gòu)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換慣用詞法:語言的關(guān)鍵字:else if int

2、return void while專用符號:+ - * / <<=>>=!= = ;,()/* */ 其他標(biāo)記是ID和NUM ,通過下列正則表達(dá)式定義:ID = letter letter*NUM = digit digit*letter = a|.|z|A|.|Z digit = 0|.|9大寫和小寫字母是有區(qū)別的 空格由空白、換行符和制表符組成。空格通常被忽略,除了它必須分開ID、NUM 關(guān)鍵字。 注釋用通常的C語言符號/ * . . . * /圍起來。注釋可以放在任何空白出現(xiàn)的位置(即 注釋不能放在標(biāo)記內(nèi))上,且可以超過一行。注釋不能嵌套scanner 的 DFA

3、+ - * <= >= = != ;,()*說明: 當(dāng)輸入的字符使DFA 到達(dá)接受狀態(tài)的時候,則可以確定一個單詞了。初始狀態(tài)設(shè)置為START,當(dāng)需要得到下一個token時,取得次token的第一個字符,并且按照DFA與對此字符的類型分析,轉(zhuǎn)換狀態(tài)。重復(fù)此步驟,直到DONE 為止,輸出token 類型。當(dāng)字符為 “ / ” 時, 狀態(tài)轉(zhuǎn)換為SLAH 再判斷下一個字符,如果為 “ *”則繼續(xù)轉(zhuǎn)到INCOMMENT ,最后以“*”時轉(zhuǎn)到ENDCOMMENT 狀態(tài),表明是注釋,如果其他的則是字符停滯于當(dāng)前字符,并且輸出“/ ”。2.1.2 程序流程圖2.1.3 各文件或函數(shù)的設(shè)計(jì)說明掃描程

4、序用至1J:scanner.h,scanner.cppscanner.h :聲明詞法狀態(tài),詞法分析/DFA 中的狀態(tài)typedef enumSTART = 1, INNUM, INID, INDBSYM, DONE DFAState;/ 定義的 Token 的類型 (31 種 ), 分別對應(yīng)于else、 if、 int、 return 、 void、 while、 +、-、*、/、<、<=、>、>=、=、!=、=、卜,、(、卜 卜 卜、卜 /*、*/、num、id、錯 誤、結(jié)束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE,P

5、LUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMM A,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET, LCOMMENT,RCOMMENT, NUM,ID,ERROR,ENDFILE TokenType;/ 定義的 Token 結(jié)構(gòu)體,包括類型、對應(yīng)的串、所在代碼的行號struct TokenTokenType tokenType;string tokenString;int lineNo;/ 每種 TokenType 對應(yīng)的串,如tokenTypeStringELS

6、E="ELSE"const string tokenTypeString32 = "OTHER", "ELSE", "IF", "INT", "RETURN","VOID", "WHILE", "PLUS", "MINUS", "TIMES", "OVER", "LT", "LEQ", "GT",

7、"GEQ", "EQ", "NEQ", "ASSIGN", "SEMI", "COMMA", "LPAREN", "RPAREN", "LMBRACKET", "RMBRACKET", "LBBRACKET", "RBBRACKET", "LCOMMENT", "RCOMMENT", "NUM",

8、"ID", "ERROR", "ENDFILE"class Scanner: 定義 scanner.cpp 中函數(shù)scanner.cpp 文件函數(shù)說明void Scanner : scan() :設(shè)置輸出結(jié)果界面以及設(shè)置各種輸出狀態(tài)。if(scanSuccess=false)cout<<" 詞法分析出錯!"<<endl;elsecout<<" 詞法分析成功了!"<<endl;printToken();/* 輸出 Token 到文件 Token.tx

9、t 中 */ 正在刪除注釋void Scanner : deleteComments()TokenType Scanner : returnTokenType(string s)/ 返回 Token 的類型DFAState Scanner : charType(char c)/ 返回字符的類型typedef enum ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE, / 關(guān)鍵字ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,EQ,UEQ,LT,LPAREN,RPAREN,SEMI,BT,LQ,BQ,DOU,LZGH,RZGH,LD

10、GH,RDGH,/ 特殊字符:= + - * / = != < 等 TokenType;2.1.4 測試程序說明根據(jù)附錄 A 后面的例子,程序輸入兩個整數(shù),計(jì)算并打印出它們的最大公因子,保存為a.txt 。/* A program to perform Eucild'sAlgorithm to compute gcd. */int gcd (int u, int v)if (v=0)return u;else returngcd(v,u-u/v*v); /* u-u/v*v= u mod v */void main(void)int x;int y;x=input();y=inp

11、ut();output(gcd(x,y);2.2、 語法分析parse 部分2.2.1 系統(tǒng)設(shè)計(jì)思想設(shè)計(jì)思想:parser 用遞歸下降分析方法實(shí)現(xiàn),通過調(diào)用詞法分析函數(shù)getToken 實(shí)現(xiàn)語法分析。根據(jù)C-語言的規(guī)則,得出BNF語法如下:1.program->declaration-list2 .declaration-list->declaration-list declaration | declaration3 .declaration->var-declaration|fun-declaration4 .var-declaration->type-specif

12、ier ID;|type-specfier IDNUM5.type-specifier->int|void6 .fun-specifier ID(parans) compound-stmt7.params->params-list|void8.param-list->param-list,param|param9 .param->type-specifier ID|type-specifier ID 10 .compound-stmt->local-declarations statement-list11 .local-declarations->loca

13、l-declarations var-declaration|empty12 .statement-list->statement-list statement|empty13.statement->expression-stmt|compound-stmt|selection-stmt|iterati on-stmt|return-stmt14.expression-stmt->expression;|;13 .selection-stmt->if(expression)statement|if(expression)statementelsestatement16.

14、iteration-stmt->while(expression)statement17.return-stmt->return ;|return expression;18.expression->var=expression|simple-expression19.var->ID|IDexpression20.simple-expression->additive-expressionrelopadditive-expression|additive-expression21.relop-><=|<|>|>=|=|!=22 .ad

15、ditive-expression->additive-expression addop term|term23 .addop->+|-24 .term->term mulop factor|factor25 .mulop->*|/26.factor->(expression)|var|call|NUM27.call->ID(args)28.args->arg-list|empty29.arg-list->arg-list,expression|expression2.1.2 語法分析程序流程圖2.1.3 各文件或函數(shù)的設(shè)計(jì)說明語法分析程序包括:

16、parser.cpp,parser.h? parser.cpp :Parser 二 Parser() 界面設(shè)計(jì)Token Parser 二 getToken()/ 獲取 scanner 中保存在 TokenList 數(shù)組中的 Token , 并且每次獲取完之后數(shù)組下標(biāo)指向下一個void Parser 二 syntaxError(string s)/ 出錯處理void Parser 二 match(TokenType ex)/匹配出錯TreeNode * Parser 二 declaration(void)/類型匹配錯誤TreeNode * Parser 二 param_list(TreeNod

17、e * k)/k可能是已經(jīng)被取出來的 VoidK,但又不是(void)類型的參數(shù)列表,所以一直傳到param中去,作為其一個子節(jié)點(diǎn)? parse.h :對parse.c的函數(shù)聲明/19種節(jié)點(diǎn)類型,分別表示int、id、void、數(shù)值、變量聲明、數(shù)組聲明、函數(shù)聲明、函數(shù)聲明參數(shù)列表、函數(shù)聲明參數(shù)、復(fù)合語句體、if、 while 、 return 、 賦值、 運(yùn)算、 數(shù)組元素、函數(shù)調(diào)用、函數(shù)調(diào)用參數(shù)列表、未知節(jié)點(diǎn)typedef enum IntK, IdK, VoidK, ConstK, Var_DeclK, Arry_DeclK, FunK, ParamsK, ParamK, CompK, Se

18、lection_StmtK, Iteration_StmtK, Return_StmtK, AssignK, OpK, Arry_ElemK, CallK, ArgsK, UnkownK Nodekind;typedef enum Void,Integer ExpType;ofstream fout_Tree("tokenTree.txt");/ 輸出語法樹到文件/treeNode 定義 包括子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)、所處行號、節(jié)點(diǎn)類型、屬性、表達(dá)式返回類型typedef struct treeNodeTreeNode * newNode(Nodekind k);/ 根據(jù)節(jié)點(diǎn)類型新

19、建節(jié)點(diǎn)TreeNode * declaration_list(void);TreeNode * declaration(void);TreeNode * params(void);TreeNode * param_list(TreeNode * k);TreeNode * param(TreeNode * k);TreeNode * compound_stmt(void);TreeNode * local_declaration(void);TreeNode * statement_list(void);TreeNode * statement(void);TreeNode * express

20、ion_stmt(void);TreeNode * selection_stmt(void);TreeNode * iteration_stmt(void);TreeNode * return_stmt(void);TreeNode * expression(void);TreeNode * var(void);TreeNode * simple_expression(TreeNode * k);TreeNode * additive_expression(TreeNode * k);TreeNode * term(TreeNode * k);TreeNode * factor(TreeNod

21、e * k);TreeNode * call(TreeNode * k);TreeNode * args(void);2.1.4 測試程序說明根據(jù)附錄 A 后面的例子,程序輸入兩個整數(shù),計(jì)算并打印出它們的最大公因子,保存為a.txt 。/* A program to perform Eucild's Algorithm to compute gcd. */int gcd (int u, int v)if (v=0) return u;else returngcd(v,u-u/v*v); /* u-u/v*v= u mod v */void main(void)int x;int y;x

22、=input();y=input();output(gcd(x,y);3. 程序代碼實(shí)現(xiàn)按文件列出主要程序代碼, 添加必要的注釋.Scanner.cpp:#include <cstdlib>#include <iostream>#include <fstream>#include <string>#include "scanner.h"#include<vector>using namespace std;/*Name: 詞法分析器Copyright:Author: XXXDate: 19-05-14 12:00D

23、escription: 提取出 token*/Scanner : Scanner() scanSuccess = true;charIndex = 0;str = ""commentFlag = true;sourseString = ""lineCount = 0;void Scanner : scan()cout<<" 開始詞法分析."<<endl;bool doubleSym = false;getSourseStringFromFile("sourseFile.txt");int s

24、tate = START;lineCount = 0;char ch;while(state<6)ch = getNextChar();if('0'=ch)Token t;t.lineNo = lineCount;t.tokenString = ""t.tokenType = ENDFILE;tokenList.push_back(t); break;if(START=state)/ 初始狀態(tài)和空格state = charType(ch);if(state!=START)str += ch;else if(INNUM=state)/digitstate

25、 = charType(ch);if(state!=INNUM)state = DONE;elsestr += ch;else if(INID=state)/letterstate = charType(ch);if(state!=INID)state = DONE;elsestr += ch;else if(INDBSYM=state)/ 除了<>=!之外的各種符號if('='=ch)str += ch;doubleSym = true;elsedoubleSym = false;state = DONE;if(DONE=state)/ 接收狀態(tài)int tp =

26、0;if('n'=ch)tp = 1;Token t;t.lineNo = lineCount-tp;t.tokenString = str;t.tokenType = returnTokenType(str);tokenList.push_back(t);if(ERROR=t.tokenType)scanSuccess = false;int lastState = charType(strstr.length()-1);if(lastState=INNUM | lastState=INID | (lastState=INDBSYM && doubleSym=

27、false)backToLastChar();str = ""state = START;if(doubleSym=true)doubleSym = false;if(scanSuccess=false)cout<<" 詞法分析出錯!"<<endl;elsecout<<" 詞法分析成功了!"<<endl;printToken();/ 輸出 Token 到文件 Token.txt 中Token Scanner : getTokenAt(int tokenIndex)Token token;

28、token.lineNo = lineCount;token.tokenString = ""token.tokenType = ENDFILE;if(tokenIndex<tokenList.size()token = tokenList.at(tokenIndex+);return token;void Scanner : getSourseStringFromFile(string path)ifstream fin(path.c_str();string temp;sourseString = ""while(getline(fin,tem

29、p)sourseString += temp;sourseString += 'n'fin.close();charIndex = 0;void Scanner : deleteComments()cout<<" 正在刪除注釋."<<endl;ofstream fout_Sourse("sourseFile.txt");int state = 1;char ch;while(state<6)ch = getNextChar();if('0'=ch)/ 文件結(jié)束break;if(1=state)

30、if('/'=ch)state = 2;elsestate = 1;fout_Sourse<<ch;else if(2=state)if('*'=ch)state = 3;commentFlag = false;elsestate = 1;fout_Sourse<<"/"<<ch;else if(3=state)if('*'=ch)state = 4;elsestate = 3;else if(4=state)if('*'=ch)state = 4;else if('

31、/'=ch)state = 5;elsestate = 3;if(5=state)/ 結(jié)束狀態(tài),處理commentFlag = true;state = 1;if(!commentFlag)cout<<" 注釋錯誤,沒有結(jié)束符!"<<endl;scanSuccess = false; elsecout<<" 注釋已經(jīng)成功刪除!"<<endl;TokenType Scanner :returnTokenType(string s)/返回 Token 的類型TokenType t;if(s="

32、else")t = ELSE;else if(s="if")t = IF;else if(s="int")t = INT;else if(s="return") t = RETURN;else if(s="void")t = VOID;else if(s="while")t = WHILE;else if(s="+")t = PLUS;else if(s="-")t = MINUS;else if(s="*")t = TIME

33、S;else if(s="/")t = OVER;else if(s="<")t = LT;else if(s="<=")t = LEQ;)else if(s=">")(t = GT;)else if(s=">=")(t = GEQ;)else if(s="=")(t = EQ;)else if(s="!=")(t = NEQ;)else if(s="=")(t = ASSIGN;)else if(s="

34、;")(t = SEMI;)else if(s=",")(t = COMMA;)else if(s="(")(t = LPAREN;else if(s=")")t = RPAREN;else if(s="")t = LMBRACKET;else if(s="")t = RMBRACKET;else if(s="")t = LBBRACKET;else if(s="")t = RBBRACKET;else if(s="/*")t

35、 = LCOMMENT;else if(s="*/")t = RCOMMENT;else if(2=charType(ss.length()-1) t = NUM;else if(3=charType(ss.length()-1)t = ID;) else (t = ERROR;) return t;)DFAState Scanner : charType(char c)/ 返回字符的類型 (if(' '=c | 'n'=c | 't'=c |'r'=c)return START;else if(c>=&

36、#39;0'&&c<='9')return INNUM;else if(c>='A'&&c<='Z')|(c>='a'&&c<='z')return INID;else if(c='<' | c='>' | c='=' | c='!')return INDBSYM;else return DONE;)char Scanner : getNextChar()

37、(if(charIndex<sourseString.length()(char ch = sourseStringcharIndex;charIndex+;if('n'=ch)lineCount+;return ch;) elsereturn '0'void Scanner : backToLastChar()if(charIndex>0)char ch = sourseStringcharIndex-1;charIndex-;if('n'=ch)lineCount-;void Scanner : printToken()ofstr

38、eam fout_Token("Token.txt");ifstream fin("sourseFile.txt");string temp;int lineCount = 0;int index = 0;while(getline(fin,temp)fout_Token<<lineCount<<": "fout_Token<<temp<<endl;while(index<tokenList.size()Token t = tokenList.at(index); if(lineC

39、ount=t.lineNo) "關(guān)鍵字fout_Token<<" "<<lineCount<<": index+; int width = 10;string headS = " "if(t.tokenType>=1&&t.tokenType<=6)/ string tp =""for(int i = 0; i<width-t.tokenString.length(); i+) tp +=""fout_Token<<

40、;"keyWord"<<headS<<t.tokenString<<"<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl; else if(t.tokenType>=7&&t.tokenType<=27)符號string tp =""for(int i = 0; i<width-t.tokenString.length(); i+) t

41、p +=""fout_Token<<"symbols"<<headS<<t.tokenString<<"<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl; else if(t.tokenType=28)NUM string tp =""for(int i = 0; i<width-t.tokenString.length(); i

42、+) tp +=""fout_Token<<"NUM : "<<headS<<t.tokenString<<"<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=29)/IDstring tp =""for(int i = 0; i<width-t.tokenString.length();

43、i+) tp +=""fout_Token<<"ID "<<headS<<t.tokenString<<"<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl; else if(t.tokenType=30)/ 錯誤 string tp =""for(int i = 0; i<width-t.tokenString.length();

44、 i+)tp += " "foutToken<<"error"<<headS<<t.tokenString<<"<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=ENDFILE)/ 結(jié)束 fout_Token<<" "<<lineCount<<": &

45、quot;fout_Token<<t.tokenString<<""<<""<<tokenTypeStringt.tokenType<<""<<endl;if(lineCount<t.lineNo)break;lineCount+;fin.close();fout_Token.close();scanner.h:#include<string>#include<vector>using namespace std;/ 定義的 Toke

46、n 的類型 (31 種 ), 分別對應(yīng)于else、 if、 int、 return 、 void、 while、 +、-、*、/、<、<=、>、>=、=、!=、=、卜,、(、卜 卜 卜、卜 /*、*/、num、id、錯 誤、結(jié)束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMM A,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET, LCOMMENT,RC

47、OMMENT, NUM,ID,ERROR,ENDFILE TokenType;typedef enumSTART = 1, INNUM, INID, INDBSYM, DONE DFAState;/ 定義的 Token 結(jié)構(gòu)體,包括類型、對應(yīng)的串、所在代碼的行號struct TokenTokenType tokenType;string tokenString;int lineNo;/ 每種 TokenType 對應(yīng)的串,如tokenTypeStringELSE="ELSE"const string tokenTypeString32 = "OTHER"

48、, "ELSE", "IF", "INT", "RETURN","VOID", "WHILE", "PLUS", "MINUS", "TIMES", "OVER", "LT", "LEQ", "GT", "GEQ", "EQ", "NEQ", "ASSIGN"

49、, "SEMI", "COMMA", "LPAREN", "RPAREN", "LMBRACKET", "RMBRACKET", "LBBRACKET", "RBBRACKET", "LCOMMENT", "RCOMMENT", "NUM", "ID", "ERROR", "ENDFILE"class Scannerp

50、ublic:bool scanSuccess;/ 詞法分析是否成功的標(biāo)志void getSourseStringFromFile(string s);/ 通過提供的文件名獲取源代碼void deleteComments();/ 刪除注釋void scan();/ 詞法分析,將分析的Token 放在 tokenList 數(shù)組中Scanner();Token getTokenAt(int);/ 根據(jù)下標(biāo)從tokenList 數(shù)組中獲取Tokenprivate:DFAState charType(char);/ 返回字符的類型,如:空格2:數(shù)字3:字母等char getNextChar();/ 獲取

51、到下一個字符void backToLastChar();TokenType returnTokenType(string s);/ 根據(jù)字符串返回Token 類型void printToken();/ 將詞法分析好的Token 輸出到文件Token.txt 中string sourseString;/ 獲取源代碼的字符串int charIndex;/ 配合 getNextChar() ,指定要取的字符位置string str;/ 在分析過程中保存Token 對應(yīng)的串bool commentFlag;/ 標(biāo)注注釋開始的標(biāo)志int lineCount;/ 對行號計(jì)數(shù),每次獲取到'/n

52、9; 就自增vector<Token> tokenList;/ 保存的 Token 序列 ;Parser.cpp:#include "scanner.h"#include "parser.h"#include <iostream>#include <string>using namespace std;Parser : Parser()step = 0;tokenIndex = 0;Error = false;string path = "a.txt"cout<<" 請輸入文件

53、名:"cin>>path;scanner.getSourseStringFromFile(path);scanner.deleteComments();if(scanner.scanSuccess) scanner.scan();if(scanner.scanSuccess) cout<<" 開始語法分析."<<endl;syntaxTree = parse(); printTree(syntaxTree);if(Error)cout<<" 語法分析過程出錯!"<<endl;elsec

54、out<<" 語法分析成功!"<<endl;Token Parser : getToken()/ 獲取 scanner 中保存在 TokenList 數(shù)組中的 Token , 并且每次獲取完之后數(shù)組下標(biāo)指向下一個 lastToken = currentToken;currentToken = scanner.getTokenAt(tokenIndex+); return currentToken;void Parser : syntaxError(string s) fout_Tree<<s<<"-> Synt

55、ax error at line "<<lastToken.lineNo<<" 出錯附近Token:"<<lastToken.tokenString<<"Token 類型:"<<tokenTypeStringlastToken.tokenType<<endl;Error = true;void Parser : match(TokenType ex) if(currentToken.tokenType=ex) getToken(); else syntaxError(&qu

56、ot; 匹配 "+tokenTypeStringex+" 出錯 ");void Parser : printSpace(int n)for(int i = 0; i<n; i+) fout_Tree<<" "void Parser : printTree(TreeNode * t)int i;while(t!=NULL)printSpace(step);switch (t->nodekind)case VoidK:fout_Tree<<"VoidK"<<endl;break;c

57、ase IntK:fout_Tree<<"IntK"<<endl;break;case IdK:fout_Tree<<"IdK: "<<t-><<endl; break;case ConstK:fout_Tree<<"ConstK: "<<t->attr.val<<endl; break;case Var_DeclK:fout_Tree<<"Var_DeclK"<<e

58、ndl;break;case Arry_DeclK:fout_Tree<<"Arry_DeclK"<<endl; break;case FunK:fout_Tree<<"FuncK"<<endl;break;case ParamsK:fout_Tree<<"ParamsK"<<endl;break;case ParamK:fout_Tree<<"ParamK"<<endl;break;case CompK:fout_Tr

59、ee<<"CompK"<<endl;break;case Selection_StmtK:fout_Tree<<"If"<<endl;break;case Iteration_StmtK:fout_Tree<<"While"<<endl;break;case Return_StmtK:fout_Tree<<"Return"<<endl;break;case AssignK:fout_Tree<<"A

60、ssign"<<endl;break;case OpK:fout_Tree<<"Op:"fout_Tree<<tokenTypeStringt->attr.op<<endl; break;case Arry_ElemK:fout_Tree<<"Arry_ElemK"<<endl;break;case CallK:fout_Tree<<"CallK"<<endl;break;case ArgsK:fout_Tree<&l

61、t;"ArgsK"<<endl;break;default:fout_Tree<<"UnknownK : Unknown exp kind"<<endl; break;step+;/ 進(jìn)入子節(jié)點(diǎn)多輸出空格for(i = 0;i<MAXCHILDREN;i+)if(t->childi!=NULL)printTree(t->childi);step-;/進(jìn)入兄弟節(jié)點(diǎn)時,由于進(jìn)入子節(jié)點(diǎn)時n+了,所以要n-回來,從而輸出 一樣的空格空格t = t->sibling;TreeNode * Parser :

62、 newNode(Nodekind kind)TreeNode * p = (TreeNode *)malloc(sizeof(TreeNode);int k;if(p=NULL) cout<<" 內(nèi)存分配出錯!"<<endl; elsefor(k = 0;k<MAXCHILDREN;k+)p->childk = NULL;p->sibling = NULL;p->nodekind = kind;p->lineno = currentToken.lineNo;if(kind=OpK | kind=IntK | kind=IdK)p->type = Integer;if(kind=IdK)p-> = ""if(kind=ConstK)p->attr.val = 0;return p;TreeNode * Parser : parse(void)TreeNode * t;currentToken = getToken();lastToken =

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論