合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告

上傳人:r****d 文檔編號(hào):84433994 上傳時(shí)間:2022-05-03 格式:DOC 頁(yè)數(shù):69 大?。?41.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告_第1頁(yè)
第1頁(yè) / 共69頁(yè)
合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告_第2頁(yè)
第2頁(yè) / 共69頁(yè)
合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告_第3頁(yè)
第3頁(yè) / 共69頁(yè)

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《合肥工業(yè)大學(xué) 編譯原理實(shí)驗(yàn)報(bào)告(69頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 合肥工業(yè)大學(xué)計(jì)算機(jī)與信息學(xué)院 編譯原理實(shí)驗(yàn)報(bào)告 專(zhuān) 業(yè): 學(xué) 號(hào): 姓 名: 指導(dǎo)老師: 完成時(shí)間: 實(shí)驗(yàn)一 詞法分析設(shè)計(jì) 一、 實(shí)驗(yàn)?zāi)康? 通過(guò)本實(shí)驗(yàn)的編程實(shí)踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計(jì)的原理和構(gòu)造方法,使學(xué)生對(duì)編譯的基本概念、原理和方法有完整和清楚的理解,并且能夠正確和熟練地運(yùn)用。 二、 實(shí)驗(yàn)環(huán)境 Windows 8.1 、Visual Studio 20

2、13、C++ 三、 實(shí)驗(yàn)原理 (1) 實(shí)驗(yàn)數(shù)據(jù)結(jié)構(gòu)說(shuō)明 Table string str[40] int strcount string name 存儲(chǔ)string 存儲(chǔ)string 的數(shù)目 存儲(chǔ)type名 Table() ~Table() void setname(string strTemp) string getname() void update(string strTemp) void init(string filename) int search(string strTemp) 構(gòu)造函數(shù) 析構(gòu)函數(shù) 設(shè)置name值 獲取name值 添

3、加strTemp的值 初始化table 在table中查詢(xún)strTemp OutToken string value int type int pointer string tyname int line int row 存儲(chǔ)分析單詞的值 Type的編號(hào) 單詞的位置 存儲(chǔ)在表中位置 分析單詞的行的值 分析單詞的列的值 OutToken(string val,int t,int p,string tn,int l,int r) ~OutToken() friend ostream& operator <<(ostream& output, OutToke

4、n& ot) 有參數(shù)構(gòu)造函數(shù) 析構(gòu)函數(shù) 重載<<函數(shù) TokenAnalyzer Table Keyword Table Seperator Table sumoperator Table reloperator Table constant Table identifier OutToken outtoken Type 1:C++關(guān)鍵字 Type 2:分界符 Type 3:算術(shù)運(yùn)算符 Type 4:關(guān)系運(yùn)算符 Type 5:常數(shù) Type 6:標(biāo)識(shí)符 二元式 TokenAnalyzer() ~TokenAnalyzer() void ini

5、ttable() void display() void strsearch(string strin,int line,int row) void readcode() 構(gòu)造函數(shù) 析構(gòu)函數(shù) 初始化表 輸出所有單詞二元式 分析strin 讀取源代碼 (2) 實(shí)驗(yàn)算法描述 1)詞法分析設(shè)計(jì)流程圖 2) 詞法分析程序框圖 3)統(tǒng)計(jì)字符位置程序框圖 四、 實(shí)驗(yàn)內(nèi)容 使用C++語(yǔ)言實(shí)現(xiàn)對(duì)C++語(yǔ)言字集的源程序進(jìn)行詞法分析。通過(guò)輸入源程序從左到右對(duì)字符串進(jìn)行掃描和分解,依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值;若遇到錯(cuò)誤則顯示ERROR,然后跳過(guò)

6、錯(cuò)誤部分繼續(xù)顯示;同時(shí)進(jìn)行標(biāo)識(shí)符登記符號(hào)表的管理。 詞法分析設(shè)計(jì)主要工作: (1) 從源程序中讀取字符 (2) 統(tǒng)計(jì)行數(shù)和列數(shù)用于錯(cuò)誤單詞的定位 (3) 刪除空格類(lèi)字符,包括回車(chē)、制表符空格 (4) 按拼寫(xiě)單詞,并用(內(nèi)碼,屬性)二元式來(lái)表示,(屬性值—Token的機(jī)內(nèi)表示) (5) 如果發(fā)現(xiàn)錯(cuò)誤則報(bào)告出錯(cuò) (6) 根據(jù)需要是否填寫(xiě)標(biāo)識(shí)符供以后各階段使用 單詞的基本分類(lèi): (1) 關(guān)鍵字:由各程序語(yǔ)言具有的固定意義的標(biāo)識(shí)符(保留字例) (2) 標(biāo)識(shí)符:用以表示各種名字的變量名、數(shù)組名、函數(shù)名 (3) 常數(shù):任何數(shù)值常數(shù) (4) 運(yùn)算符:+、-、*、/ (5) 關(guān)系運(yùn)算

7、符:<、<=、=、>、>=、<>、| (6) 分界符: ;、,、(、)、[、]、{、} 五、 實(shí)驗(yàn)要求 1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等 2、標(biāo)識(shí)符填寫(xiě)的符號(hào)表需提供給編譯程序的以后各階段使用 3、根據(jù)測(cè)試數(shù)據(jù)進(jìn)行測(cè)試。測(cè)試實(shí)例分為三部分: (1) 各種合法輸入 (2) 各種組合輸入 (3) 有記號(hào)組成的句子 4、詞法分析程序設(shè)計(jì)要求輸出形式 單詞 二元序列 類(lèi)型 位置(行,列) for (1,for) 關(guān)鍵字 (1,1) 六、 實(shí)驗(yàn)結(jié)果 (1) 分析代碼 (2) 分析結(jié)果 七、 實(shí)驗(yàn)總結(jié) 通過(guò)此次實(shí)驗(yàn)的編程實(shí)

8、踐加強(qiáng)了自己對(duì)詞法分析的任務(wù)的理解,在一定程度上初步掌握了詞法分析程序設(shè)計(jì)的原理和構(gòu)造,并且在對(duì)編譯的基本概念、原理和概念方法有更清楚的認(rèn)識(shí)。在實(shí)驗(yàn)過(guò)程中自己對(duì)詞法分析程序中的算法理解出現(xiàn)了一定的偏差,認(rèn)為其中的標(biāo)識(shí)符是程序執(zhí)行之前必須都由自己手動(dòng)構(gòu)造,導(dǎo)致自己在程序的驗(yàn)收階段出現(xiàn)了問(wèn)題。事實(shí)上,在詞法分析程序中,若識(shí)別的字符串是首字符字母,則在關(guān)鍵字表中查詢(xún)是否存在,如果不存在則將新造入標(biāo)識(shí)符表中。對(duì)于在源代碼中注釋問(wèn)題,由于本程序是以行為單位從TXT文件中讀取代碼,當(dāng)自己將注釋的判斷程序放置掃描每一行的動(dòng)作前,導(dǎo)致了添加在有效合法語(yǔ)句后的注釋語(yǔ)句全部被分析為Error,所以之后將判斷注釋的

9、語(yǔ)句放置在以一個(gè)單位取字符串之前,當(dāng)某一行的字符串中含有//或/*時(shí),則將其后的字符串全部忽略,即跳出本行的后續(xù)的分析步驟,重新執(zhí)行下一行的代碼讀取和分析操作。 八、實(shí)驗(yàn)代碼 #include #include #include #include using namespace std; class Table { private: string str[40]; int strcount; string name; public: Table(); ~Table();

10、 void setname(string strTemp); string getname(); void update(string strTemp); void init(string filename); int search(string strTemp); }; Table::Table() { for (int i = 0; i<40; i++) str[i] = ""; strcount = 0; name = ""; } Table::~Table() { } void Table::setname(strin

11、g strTemp) { name = strTemp; } string Table::getname() { return name; } void Table::update(string strTemp) { str[++strcount] = strTemp; } void Table::init(string filename) { string strin; ifstream infiles(filename); if (!infiles) cout << "打開(kāi)"<

12、 while (getline(infiles, strin)) update(strin); infiles.close(); } int Table::search(string strTemp) { for (int i = 1; i<=strcount; i++) { if (str[i] == strTemp) return i ; } return 0; } class OutToken { private: string value; int type; int pointer; string tyn

13、ame; int line; int row; public: OutToken(string val="",int t = 0,int p = 0,string tn = "",int l = 0, int r = 0); ~OutToken(); friend ostream& operator <<(ostream& output, OutToken& ot); }; OutToken::OutToken(string val ,int t ,int p ,string tn ,int l ,int r ) { value = val; type

14、= t; pointer = p; tyname = tn; line = l; row = r; } OutToken::~OutToken() { } ostream& operator <<(ostream& output, OutToken& ot) { if (ot.type!= 0) << "(" << setw(2) << ot.type << setw(2) << "," << setw(2) << ot.pointer << setw(10) << ")" << "(" << ot.line << ","

15、 << ot.row << ")" << endl; else << setw(17) << "ERROR" << "(" << ot.line << "," << ot.row << ")" << endl; return output; } class TokenAnalyzer { private: Table keyword; Table seperator; Table sumoperator; Table reloperator; Table constant; Table identifer; OutTo

16、ken outtoken[100]; int outcount; public: TokenAnalyzer(); ~TokenAnalyzer(); void inittable(); void display(); void strsearch(string strin, int line, int row); void readcode(); }; TokenAnalyzer::TokenAnalyzer() { keyword.setname("關(guān)鍵字"); seperator.setname("分界符"); sumoperator.

17、setname("運(yùn)算符"); reloperator.setname("關(guān)系運(yùn)算符"); constant.setname("常數(shù)"); identifer.setname("標(biāo)識(shí)符"); outcount = 0; } TokenAnalyzer::~TokenAnalyzer() { } void TokenAnalyzer::inittable() { seperator.init("seperator.txt"); reloperator.init("reloperator.txt"); sumoperator.init("sumo

18、perator.txt"); constant.init("constant.txt"); keyword.init("keyword.txt"); } void TokenAnalyzer::display() { for (int i = 1; i <= outcount; i++) cout << outtoken[i]; } void TokenAnalyzer::strsearch(string strin,int line,int row) { if ((strin[0] >= 'a'&&strin[0] <= 'z') || (s

19、trin[0] >= 'a'&&strin[0] <= 'z')) { if (keyword.search(strin)) outtoken[++outcount] = OutToken(strin, 1, keyword.search(strin), keyword.getname(), line, row); else { if (identifer.search(strin)) outtoken[++outcount] = OutToken(strin, 6, identifer.search(strin), identifer.getn

20、ame(), line, row); else { identifer.update(strin); outtoken[++outcount] = OutToken(strin, 6, identifer.search(strin), identifer.getname(), line, row); } } } else { if (strin[0] >= '0'&&strin[0] <= '9') { if (constant.search(strin)) outtoken[++outcount] =

21、 OutToken(strin, 5, constant.search(strin), constant.getname(), line, row); else { constant.update(strin); outtoken[++outcount] = OutToken(strin, 5, constant.search(strin), constant.getname(), line, row); } } else { if (seperator.search(strin)) outtoken[+

22、+outcount] = OutToken(strin, 2, seperator.search(strin), seperator.getname(), line, row); else { if (reloperator.search(strin)) outtoken[++outcount] = OutToken(strin, 4, reloperator.search(strin), reloperator.getname(), line, row); else { if (sumoperator.search(str

23、in)) outtoken[++outcount] = OutToken(strin, 4, sumoperator.search(strin), sumoperator.getname(), line, row); else outtoken[++outcount] = OutToken(strin, 0, 0, "ERROR", line, row); } } } } } void TokenAnalyzer::readcode() { ifstream infile("code.txt"); if (!

24、infile) cout << "打開(kāi)失?。? << endl; string strin; int line; int row; line = 0; while (getline(infile, strin)) { line++; row = 0; if (strin != " ") { string strtemp = ""; while (strin[0] == ' '&&strin.length() > 1) strin = strin.substr(1, strin.length()); if (

25、strin[0] == '/'&&strin[1] == '/') continue; if (strin == " ") strin = ""; while (strin != ""&& strin != strtemp) { row++; if (strin.find(" ")) strtemp = strin.substr(0, strin.find(" ")); else strtemp = strin; if (strin[0] == '/'&&strin[1] == '/')

26、 continue; strsearch(strtemp, line, row); if (strin.find(" ")) strin = strin.substr(strin.find(" ") + 1, strin.length()); while (strin[0] == ' '&&strin.length() > 1) strin = strin.substr(1, strin.length()); if (strin == " ") strin = ""; } } } in

27、file.close(); } void main(void) { TokenAnalyzer T; T.inittable(); T.readcode(); T.display(); } 實(shí)驗(yàn)二 LL(1)分析文法 一、 實(shí)驗(yàn)?zāi)康? 通過(guò)完成預(yù)測(cè)分析法的語(yǔ)法分析程序,了解預(yù)測(cè)分析法和遞歸子程序法的區(qū)別和聯(lián)系。使學(xué)生了解語(yǔ)法分析的功能,掌握語(yǔ)法分析程序設(shè)計(jì)的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開(kāi)發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專(zhuān)業(yè)素質(zhì),為培養(yǎng)適應(yīng)社會(huì)多方面需要的能力。 二、 實(shí)驗(yàn)環(huán)境 Windows 8.1 、Visual Studio 2013、C+

28、+ 三、 實(shí)驗(yàn)原理 (1) 實(shí)驗(yàn)數(shù)據(jù)結(jié)構(gòu)說(shuō)明 Stack char charstack[30] int count 存儲(chǔ)棧符號(hào) 存儲(chǔ)的符號(hào)個(gè)數(shù) Stack() ~Stack() void push(char ch) void pop() char gettop() void display() 構(gòu)造函數(shù) 析構(gòu)函數(shù) 將ch壓棧 棧頂出棧 將棧頂元素彈棧返回 打印棧內(nèi)容 LLAnalyzer char TerminalSymbol[20] char NonTerminalSymbol[20] char linechar[20] char rowc

29、har[20] int M[20][20] string Grammar[20] string Firstset[20] string Followset[20] stack chars 終結(jié)符 非終結(jié)符 M表行表頭 M表列表頭 狀態(tài)表 文法 First集 Follow集 符號(hào)棧 LLAnalyzer() ~LLAnalyzer() void init() void initM() int search(char array[], char ch) void readfile() string getfirst(char ch) string ge

30、tfirststr(string str) void setfirstset() string getfollow(char ch) string linkstring(string str, string strt) string chartostring(char ch) void setfollow() void setM() int searchstr(string array [], string strt) bool Lanalyzer(string strin) void pushstring(int strno) 構(gòu)造函數(shù) 析構(gòu)函數(shù) 初始化 初始化M表

31、 查詢(xún)ch返回位置 讀取文法存入Grammar中 生成字符ch 的First集 生成字符串str First集 所有文法生成First集 生成字符ch的First集 兩字符串不同的符連接 字符轉(zhuǎn)換成字符串返回 生成所有文法Follow集 生成M表 查詢(xún)字strt返回位置 文法分析 產(chǎn)生式逆序壓棧 (2) 實(shí)驗(yàn)算法思想描述 1) LL(1)文法程序框圖 四、 實(shí)驗(yàn)內(nèi)容 (1) 根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任何輸入的符號(hào)串進(jìn)行分析 (2) 構(gòu)造預(yù)測(cè)分析表,并利用分析表和一個(gè)棧來(lái)實(shí)現(xiàn)對(duì)上述程序設(shè)計(jì)語(yǔ)言的分析程序 (3) 分析法的功能

32、是利用LL(1)控制程序根據(jù)顯示棧頂內(nèi)容、向前看符號(hào)以及LL(1)分析表,對(duì)輸入符號(hào)串自上而下的分析過(guò)程 五、 實(shí)驗(yàn)要求 1、編程時(shí)注意風(fēng)格:空行的使用釋縮進(jìn)等。 2、如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出提示信息。 3、對(duì)下列文法,用LL(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析 (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 輸出格式 步驟 分析棧 剩余輸入串 所用產(chǎn)生式 動(dòng)作 0 #E i+i*i# 初始化 六、 實(shí)驗(yàn)結(jié)果 (1)構(gòu)建

33、First和Follow集 (2) 構(gòu)建狀態(tài)轉(zhuǎn)移表M (3) LL(1)分析測(cè)試實(shí)例 1)正確實(shí)例 2)錯(cuò)誤實(shí)例 七、 實(shí)驗(yàn)總結(jié) 通過(guò)完成預(yù)測(cè)LL(1)分析法的語(yǔ)法分析程序,自己了解了預(yù)測(cè)分析法和遞歸子程序法的區(qū)別和聯(lián)系。使自己了解了語(yǔ)法分析的功能,掌握語(yǔ)法分析程序設(shè)計(jì)的原理和構(gòu)造方法,并且使自己對(duì)基本的程序應(yīng)用的開(kāi)發(fā)具有更進(jìn)一步的理解。但是在此次編程實(shí)驗(yàn)中,由于自己對(duì)First集的構(gòu)建算法理解上出現(xiàn)了一定的失誤,導(dǎo)致前期的實(shí)驗(yàn)中總是達(dá)不到自己預(yù)測(cè)的輸出,后通過(guò)斷點(diǎn)調(diào)試一步一步找出了程序中的錯(cuò)誤。 八、實(shí)驗(yàn)代碼 #include #i

34、nclude #include #include using namespace std; class stack { private: char charstack[30]; int count; public: stack(); ~stack(); void push(char ch); void pop(); char gettop(); void displays(); }; stack::stack() { count = 0; for (int i = 0; i

35、< 30; i++) charstack[i] = ' '; } stack::~stack() { } void stack::push(char ch) { charstack[count++] = ch; } void stack::pop() { count--; } char stack::gettop() { return charstack[--count]; } void stack::displays() { int i = 0; while (i < count) { cout <

36、harstack[i++]; } for (i = 0; i < 12 - count; i++) cout << " " ; } class LLAnalyzer { private: char TerminalSymbol[20]; char NonTerminalSymbol[20]; char linechar[20]; char rowchar[20]; int M[20][20]; string Grammar[20]; string Firstset[20]; string Followset[20]; stack

37、 chars; public: LLAnalyzer(); ~LLAnalyzer(); void init(); void initM(); int search(char array[], char ch); void readfile(); string getfirst(char ch); string getfirststr(string str); void setfirstset(); string getfollow(char ch); string linkstring(string str, string strt); s

38、tring chartostring(char ch); void setfollow(); void setM(); int searchstr(string array [], string strt); bool Lanalyzer(string strin); void pushstring(int strno); }; LLAnalyzer::LLAnalyzer() { int i = 0; int j = 0; for (i = 1; i < 20; i++) { TerminalSymbol[i] = ' ';

39、NonTerminalSymbol[i] = ' '; linechar[i] = ' '; rowchar[i] = ' '; Grammar[i] = " "; Firstset[i] = " "; Followset[i] = " "; } for (i = 0; i<20; i++) for (j = 0; j<20; j++) M[i][j] = -1; } LLAnalyzer::~LLAnalyzer() { } void LLAnalyzer::init() { int i = 1; int j

40、 = 1; int l = 1; int k; string strin = Grammar[l++]; while (strin !=" ") { if (search(NonTerminalSymbol, strin[0]) == 0) NonTerminalSymbol[i++] = strin[0]; strin = strin.substr(3, strin.length()); for (k = 0; k= 'A'&&strin[k] <

41、= 'Z') { if (search(NonTerminalSymbol, strin[k]) == 0) NonTerminalSymbol[i++] = strin[k]; } else { if (strin[k] == '|') continue; if (search(TerminalSymbol, strin[k]) == 0) TerminalSymbol[j++] = strin[k]; } } strin = Grammar[l++]; } }

42、 void LLAnalyzer::initM() { int i = 1; int j = 1; while (NonTerminalSymbol[i] != ' ') { rowchar[i] = NonTerminalSymbol[i++]; } i = 1; while (TerminalSymbol[i] != ' ') { if (TerminalSymbol[i] != '^') linechar[j++] = TerminalSymbol[i++]; else i++; } linechar[j]

43、= '#'; } int LLAnalyzer::search(char array[], char ch) { int i; for (i = 1; i<20; i++) if (array[i] == ch) return i; return 0; } void LLAnalyzer::readfile() { int i = 1; ifstream infile("Grammar.txt"); if (!infile) cout << "Cann't open the Grammar !" << endl; else {

44、 string strin; string strsave; while (getline(infile, strin)) { while (strin.find('|') != -1) { strsave = strin.substr(0, strin.find('|')); Grammar[i++] = strsave; strsave = strin.substr(strin.find('|')+1,strin.length()); strin = strin.substr(0, 3); strin

45、 = strin + strsave; } Grammar[i++] = strin; } } infile.close(); } string LLAnalyzer::getfirst(char ch) { string strResult = ""; if (search(TerminalSymbol, ch) != 0) strResult += ch; else { int i = 1; while (Grammar[i] != " ") { string str = Grammar[i];

46、 if (str[0] == ch) { str = str.substr(3, str.length()); if (search(TerminalSymbol, str[0]) != 0) strResult += str[0]; else { for (int j = 0; j < int(str.length()); j++) { string strt = getfirst(str[j]); if (strt.find('^') != -1) {

47、 int k = strt.find('^'); if (k == strt.length() - 1) strt = strt.substr(0, strt.length() - 1); else { string strte = str.substr(0, strt.find('^')); strt = strte + strt.substr(strt.find('^') + 1, strt.length()); } strResult += s

48、trt; if (j == str.length() - 1) strResult += "^"; } else { strResult += strt; break; } } } } i++; } } return strResult; } string LLAnalyzer::getfirststr(string str) { string strte; string strResult = "";

49、 for (int k = 0; k < int(str.length()); k++) { //若為終結(jié)符 if (search(TerminalSymbol, str[k])) { strResult = linkstring(strResult, chartostring(str[k])); break; } //若為非終結(jié)符 else { strte = Firstset[search(NonTerminalSymbol, str[k])]; if (strte[strte.length() - 1] ==

50、 '^') { strte = strte.substr(0, strte.length() - 1); strResult = linkstring(strResult, strte); if (k == str.length() - 1) strResult = linkstring(strResult, "^"); } else { strResult = linkstring(strResult, strte); break; } } } return strResult

51、; } void LLAnalyzer::setfirstset() { int i = 1; int local = 0; while (NonTerminalSymbol[i] != ' ') { local = search(NonTerminalSymbol, NonTerminalSymbol[i]); Firstset[local] = getfirst(NonTerminalSymbol[i]); i++; } } string LLAnalyzer::getfollow(char ch) { string str

52、Result = ""; if (ch == NonTerminalSymbol[1]) strResult = linkstring(strResult,"#"); int i = 1; while (Grammar[i] != " ") { string str = Grammar[i]; if (str.find(ch,3) != -1) { int j = str.find(ch,3); if (j < int(str.length())) { string strt; string str

53、te; strt = str.substr(j+1, strt.length()-1); strte = getfirststr(strt); if (strte == "") { if (str[0] != ch) strResult = linkstring(strResult, getfollow(str[0])); } else { if (strte[strte.length() - 1] == '^') { strte = strte.substr(

54、0, strte.length() - 1); strResult = linkstring(strResult, strte); if (str[0] != ch) strResult = linkstring(strResult, getfollow(strt[0])); } else strResult = linkstring(strResult, strte); } } } i++; } return strResult; } string LLAnalyz

55、er::linkstring(string str, string strt) { bool flag = true; for (int i = 0; i < int(strt.length()); i++) { for (int j = 0; j < int(str.length()); j++) { if (str[j] == strt[i]) { flag = false; break; } } if (flag) str += strt[i]; } return str; }

56、string LLAnalyzer::chartostring(char ch) { string strtemp = ""; return strtemp + ch; } void LLAnalyzer::setfollow() { int i = 1; int local = 0; while (NonTerminalSymbol[i] != ' ') { local = search(NonTerminalSymbol, NonTerminalSymbol[i]); Followset[local] = getfollow(NonTer

57、minalSymbol[i]); i++; } } void LLAnalyzer::setM() { int line = 0; int row = 0; int i = 1; string strt = ""; string strtFi = ""; string strtFl = ""; string str = ""; while (Grammar[i] != " ") { strt = Grammar[i]; str = strt.substr(3,strt.length()-3); strtFi = ge

58、tfirststr(str); int j = 0; while (j< int(strtFi.length())) { line = search(rowchar, strt[0]); //First if (strtFi[j] != '^') { row = search(linechar, strtFi[j]); M[line][row] = i; } //Follow else { strtFl = Followset[search(NonTerminalSymbol, s

59、trt[0])]; int k = 0; while (k < int(strtFl.length())) { row = search(linechar, strtFl[k]); string strtem = linkstring(chartostring(strt[0]), "->^"); M[line][row] = searchstr(Grammar, strtem); k++; } } j++; } i++; } } int LLAnalyz

60、er::searchstr(string array [], string strt) { int i; for (i = 1; i<20; i++) if (array[i] == strt) return i; return 0; } bool LLAnalyzer::Lanalyzer(string strin) { char ch; int l; int r; int step = 0; cout <

61、棧" < 0) { cout << setw(12) << step; chars.displays(); cout <

62、in[0] == '#') { cout << endl; return true; } else { if (ch == strin[0]) strin = strin.substr(1, strin.length() - 1); else { l = search(rowchar, ch); r = search(linechar, strin[0]); if (M[l][r] == -1) { cout << "原符號(hào)串語(yǔ)法有誤!" << endl;

63、return false; } pushstring(M[l][r]); } } cout << endl; step++; } cout<

64、g] == '^') { cout << "POP"; break; } else { if (leng == str.length() - 1) cout << "POP,PUSH("; cout << str[leng]; chars.push(str[leng--]); if (str[leng] == '>') cout << ")"; } } } void main(void) { LLAnalyzer l; l.readfile(); l.init();

65、l.initM(); l.setfirstset(); l.setfollow(); l.setM(); string strin; cout << "Enter the string you want to analyze !" << endl; cin >> strin; strin = strin + "#"; l.Lanalyzer(strin); } 實(shí)驗(yàn)三 LR(1)分析法 一、 實(shí)驗(yàn)?zāi)康? 構(gòu)造LR(1)分析程序,利用它進(jìn)行語(yǔ)法分析,判斷給出的符號(hào)串是否為該文法識(shí)別的句子,了解LR(K)分析方法是嚴(yán)格的從左向右掃描,和自底向上

66、的語(yǔ)法分析方法。 二、 實(shí)驗(yàn)環(huán)境 Windows 8.1 、Visual Studio 2013、C++ 三、 實(shí)驗(yàn)原理 (1) 實(shí)驗(yàn)數(shù)據(jù)結(jié)構(gòu) CharGet char NTS[20] char TS[20] string G[20] 非終結(jié)符 終結(jié)符 文法 CharGet() ~CharGet() void ReadFile() void DisplayCG() void InitChar() int SearchTS(char ch); int SearchNTS(char ch) char GetTS(int intTS) char GetNTS(int intNTS) string GetG(int strno) int SearchChar(char array[], char ch) 構(gòu)造函數(shù) 析構(gòu)函數(shù) 文件中讀取文法 打印文法 初始化 TS查詢(xún)ch返回位置 NTS查詢(xún)ch返回位置 將intTS位置TS返回 將intNTS位置NTS返回 將strno位置G返回 查詢(xún)ch位置并返回 ItemSet

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話(huà):18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶(hù)上傳的文檔直接被用戶(hù)下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!