![2023年詞法分析器實(shí)驗(yàn)報(bào)告_第1頁(yè)](http://file4.renrendoc.com/view/3af6917bb8b21f45d7ec1086d41b5a57/3af6917bb8b21f45d7ec1086d41b5a571.gif)
![2023年詞法分析器實(shí)驗(yàn)報(bào)告_第2頁(yè)](http://file4.renrendoc.com/view/3af6917bb8b21f45d7ec1086d41b5a57/3af6917bb8b21f45d7ec1086d41b5a572.gif)
![2023年詞法分析器實(shí)驗(yàn)報(bào)告_第3頁(yè)](http://file4.renrendoc.com/view/3af6917bb8b21f45d7ec1086d41b5a57/3af6917bb8b21f45d7ec1086d41b5a573.gif)
![2023年詞法分析器實(shí)驗(yàn)報(bào)告_第4頁(yè)](http://file4.renrendoc.com/view/3af6917bb8b21f45d7ec1086d41b5a57/3af6917bb8b21f45d7ec1086d41b5a574.gif)
![2023年詞法分析器實(shí)驗(yàn)報(bào)告_第5頁(yè)](http://file4.renrendoc.com/view/3af6917bb8b21f45d7ec1086d41b5a57/3af6917bb8b21f45d7ec1086d41b5a575.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
詞法分析器實(shí)驗(yàn)報(bào)告詞法分析器設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康模簩?duì)C語(yǔ)言的一個(gè)子集設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)樸的詞法分析器,掌握運(yùn)用狀態(tài)轉(zhuǎn)換圖設(shè)計(jì)詞法分析器的基本方法。運(yùn)用該詞法分析器完畢對(duì)源程序字符串的詞法分析。輸出形式是源程序的單詞符號(hào)二元式的代碼,并保存到文獻(xiàn)中。二、實(shí)驗(yàn)內(nèi)容:.設(shè)計(jì)原理詞法分析的任務(wù):從左至右逐個(gè)字符地對(duì)源程序進(jìn)行掃描,產(chǎn)生一個(gè)個(gè)單詞符號(hào)。理論基礎(chǔ):有限自動(dòng)機(jī)、正規(guī)文法、正規(guī)式詞法分析器(LexicalAna1yzer)又稱掃描器(Scanner):執(zhí)行詞法分析的程序.詞法分析器的功能和輸出形式功能:輸入源程序、輸出單詞符號(hào)程序語(yǔ)言的單詞符號(hào)一般分為以下五種:關(guān)鍵字、標(biāo)記符、常數(shù)、運(yùn)算符,界符.輸出的單詞符號(hào)的表達(dá)形式:?jiǎn)卧~種別用整數(shù)編碼,關(guān)鍵字一字一種,標(biāo)記符統(tǒng)歸為一種,常數(shù)一種,各種}whiIe(true);ovector<pair<int,string>>mid_resuIt;omid_result=analyst(array);OutFiIe(mid_result);cou*********************************************************\n":cou程序已完畢詞法分析,分析結(jié)果已經(jīng)存儲(chǔ)在文獻(xiàn)”<<fi1e_nam一〈V”中!?。?\n”;cou{《<"★★★★★★★丈*★火★★夫★★★★★★★*★★★**★*★★★*★★★**★\n;ocoutcc”感謝使用,謝謝再見!"VVendl;system(npausen);return0;o}/*提取文本文獻(xiàn)中的信息大/stringGetText()stringfiIenamel;cout<〈”請(qǐng)輸入源文獻(xiàn)名(涉及途徑和后綴名):,cin>>file_namel;ifstreaminfile(file_name1.c_str(),ios::in);if(!infile)0(ce無法丁開文而”"<<file_namel.c_str()?"!!!"<<endl;oexit(-1);o)cout<<endl;ocharf[10O0];infile.getIine(f,1000,EOF);infiIe.close();oprintf(f):ocout<<endI;returnf;。/*獲得一個(gè)單詞符號(hào),從位置i開始查找。0//并且有一個(gè)引用參數(shù)j,用來返回這個(gè)單詞最后一個(gè)字符在原字符串的位置。*/ostringGetWord(stringstr,inti,int&j)0(ostringno_use("(){),;\n+=*/-<>\");oj=str.find_first_of(no_usezi);if(j==-Dreturn"n;if(i!=j)j--;oreturnstr.substr(izj-i+1):o}/*這個(gè)函數(shù)用來除去字符串中連續(xù)的空格和換行//第一個(gè)參數(shù)為目的字符串,第二個(gè)參數(shù)為開始位置//返回值為連續(xù)的空格和換行后的第一個(gè)有效字符在字符串的位置*/intDeleteNull(stringstrzinti)(ofor(;;i++)if(str[i]!=*&&str[i]!=*\n')returni:0)0°/*判斷i當(dāng)前所指的字符是否為一個(gè)分界符,是的話返回真,反之假*/oboolIsBoundary(stringstr,inti)0{intt;0chararr[7]={1,1,';10for(t=0;t<7;t++)if(str[i]==arr[t])0returntrue;returnfalse:/*判斷i當(dāng)前所指的字符是否為一個(gè)運(yùn)算符,是的話返回真,反之假火/boo1Is0peration(stringstr,inti)intt;chararr[8]={+,'='><&,};for(t=0;t<8;t++)if(str[i]==arr[t])returntrue;returnfalse;}/*此函數(shù)將一個(gè)個(gè)字符串?dāng)?shù)組輸出到一個(gè)文獻(xiàn)中*/ovoidOutFile(vector<pair<int,string>>v)coutVV”請(qǐng)輸入目的文獻(xiàn)名(涉及途徑和后綴名):”;cin>>filename;ofstreamoutfile(file_name,c_str(),ios::out);if(!outfile)(oc一rr<<"無法■開文獻(xiàn)!*'?file_name,c_str()<<n!!!"<<endI;oexit(-1);)cout<<endl;ointi;ofor(i=0;i<v.size();i++)oo{ooutfiIe<<??<?'<<v[i].first<<","<<v[i].second?"\">"<<endI;oocout<<"<"<<v[i].first<<",\""<<v[i].second?'f\">"<<endI;outfi1_”\n\n**********************ooutfile.close();return;0}/火此函數(shù)判斷傳遞的參數(shù)是否為關(guān)鍵字,是的話,返回其,反之返回假文/obooIIsKey(stringstr)(stringp[7]={nmain","int","char","if",neIse","for*',"while"};0ovector<string>ppp(p,p+7);0ointu;0for(u=0;u<ppp.size();u+4-)00if(!pare(ppp[u]))oreturntrue;0returnfaIse:}/*此函數(shù)接受一個(gè)字符串?dāng)?shù)組,對(duì)它進(jìn)行詞法分析,返回一個(gè)pair?型數(shù)組大/ovector<pair<int,string>>analyst(vector<string>vec)(ovector<pair<intzstring>>temp;ointi;for(i=0;i<vec.size();i++)0{oif(vec[i].size()==1)(oif(vec[i]==n>n&&vec[i+1]=="=")0(ooostringjk=vec[i];oojk.append(vec[++i],0,1);oopair<intzstring>pp(37,jk);oootemp.push_back(pp);oocontinue;o}if(vec[i]=="<n&&vec[i+l]=="=")00(ooostringjk=vec[i];ooojk.append(vec[++i],0,1);oopair<int,string>pp(38zjk);oootemp.push_back(pp);oocontinue;}oooif(vec[i]==n=n&&vec[i+1]=="=n)0(oostringjk=vec[i]:jk.append(vec[++i],0,1);pair<int,string>pp(39,jk);oootemp.push_back(pp);oocontinue;o)oif(vec[i]=="!n&&vec[i+1]=="=n)ostringjk=vec[i];ooojk.append(vec[++i],0,1);oopair<int,string〉pp(40,jk);oootemp.push_back(pp);continue;00)ooif(vec[i]==n&&&vec[i+1]=="&")(oostringjk=vec[i];oojk.append(vec[++i],0,1):oopair<int,string>pp(42,jk);oootemp,push_back(pp);o?continue;}ooif(vec[i]==**I*'&&vec[i+1]=="I',)oostringjk=vec[i];符號(hào)各一種。4.詞法分析器的結(jié)構(gòu)5.狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)jk.append(vec[++i],0,1);pair<int,string>pp(43,jk);otemp.push_back(pp);ocontinue;}if(IsBoundary(vec[i],0)){0oif(Vec[i]=='\")0(opair<intzstring>pp1(32zvec[i]);otemp.push_back(ppl);}oif(vec[i]==H")(ooopair<intzstring>pp2(34,vec[i]);temp.push_back(pp2);ooif(vec[i]=="{")00{opair<int,string>pp3(30,vec[i]):temp.push_back(pp3);00)ooif(vec[i]=="}")0{0pair<int,string>pp4(31,vec[i]);otemp.push_back(pp4);00)ooif(vec[i]=='*(")o(opair<int,string>pp5(26,vec[i]);otemp.push_back(pp5);0}ooif(vec[i]==")")opair<int,string>pp6(27zvec[i]);temp.push_back(pp6);o}oif(vec[i]==":”)o{ooo?pair<intzstring>pp7(33,vec[i]);otemp.push_back(pp7);0}0)eIseif(IsOperation(vec[i],0)){ooif(vec[i]=="+")00{000oopair<int,string>pp8(22,vec[i]);ootemp.push_back(pp8);}if(vec[i]=="一")ooopair<intzstring>pp9(23,vec[i]);temp.push_back(pp9);00)0if(vec[i]==?*?1)0000{0000pair<int,string>pp10(24zvec[i]);000temp.push_back(pplO);0}00oif(vec[i]=="/")000{0000opair<int,string>ppll(25,vec[i]);000temp.push_back(ppl1);0000)if(vec[i]=="=")000{0000pair<intrstring>pp12(21,vec[i]);000temp.push_back(pp12);if(vec[i]==">")opair<int,string>ppi3(35,vec[i]);temp.push_back(ppi3);)oif(vec[i]=='*<")(pair<int,string>ppi4(36,vec[i]);temp.push_back(ppl4);)if(vec[i]=="&”)pair<int,string>pp26(41,vec[i]);temp.push_back(pp26);0)}oelseif(vec[i][0]<=9'&&vec[i][0]>=*0*)pair<int,string>pp24(10zvec[i]);temp,push_back(pp24);}eIse|pair<int,string>pp25(10,vec[i]);temp,push_back(pp25);)}eIseif(vec[i][0]<='9,&&vec[i][0]>='01)(pair<int,string>pp23(3,vec[i]);temp.push_back(pp23);)eIseif(IsKey(vec[i]))(if(vec[i]==,'mainn)pair<int,string>ppl5(1,vec[i]);temp.push_back(ppl5);00)oooif(vec[i]==int")00(opair<intzstring>pp16(2,vec[i]);otemp,push_back(pp16);o}ooif(vec[i]=="charn)000{ooopair<int,string>ppl7(3,vec[i]);oo?temp.push_back(ppl7);00)oif(vec[i]=='*eIse")0{0ooopair<int,string>ppi8(4zvec[i]);oootemp.push_back(pp18);oif(vec[i]==nif**)oopair<int,string>ppl9(5,vec[i]):ootemp.push_back(pp19);OO0}ooif(vec[i]==nfor")00{opair<int,string>pp20(6Zvec[i]);ootemp.push_back(pp20);o}oif(vec[i]==Hwhile")0{000oopair<int,string>pp21(7,vec[i]);ootemp.push_back(pp21);00))elsepair<int,string>pp22(10zvec[i]);otemp.push_back(pp22);0))oreturntemp;o)0/*finished*/五、運(yùn)營(yíng)調(diào)試六、實(shí)驗(yàn)心得該詞法分析器功能良好,可以完畢預(yù)定的規(guī)定。本次實(shí)驗(yàn)讓我了解了如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,并加深了我對(duì)詞法分析器原理的理解;熟悉了直接構(gòu)造詞法分析器的方法和相關(guān)原理,并學(xué)會(huì)使用c語(yǔ)言直接編寫詞法分析器;同時(shí)更純熟的掌握用c語(yǔ)言編寫程序,實(shí)現(xiàn)一定的實(shí)際功能。通過這次實(shí)驗(yàn),我對(duì)詞法分析器有了進(jìn)一步的了解,把理論知識(shí)應(yīng)用于實(shí)驗(yàn)中。也讓我重新熟悉了C語(yǔ)言的相關(guān)內(nèi)容,加深了對(duì)C語(yǔ)言知識(shí)的深化和用途的理解。通過這次語(yǔ)義分析的實(shí)驗(yàn),我對(duì)高級(jí)語(yǔ)言的學(xué)習(xí)有了更深的結(jié)識(shí),了解得更透徹。同時(shí)我了解了高級(jí)語(yǔ)言轉(zhuǎn)化為目的代碼或匯編指令的過程,。對(duì)此后的學(xué)習(xí)將起很大的作用,對(duì)以后的編程有很大的幫助.本次實(shí)驗(yàn)雖然只是完畢了一個(gè)簡(jiǎn)樸的程序,并且程序的重要框架課本上有給出,但在組織程序結(jié)構(gòu)和進(jìn)一步了解上學(xué)到了很多,加深了對(duì)編譯原理的理解,掌握樂編譯程序的實(shí)現(xiàn)方法和技術(shù)。鞏固了前面所學(xué)的知識(shí)。字符/數(shù)字開始a0字符」I'其他J2數(shù)字(、J1II.,一數(shù)字a3,其他a4+字符/數(shù)字710錯(cuò)誤a11其中2,4,5,7,8,
9,11是結(jié)束狀態(tài)錯(cuò)誤A12三、程序設(shè)計(jì)1.總體模塊設(shè)計(jì)/*用來存儲(chǔ)目的文獻(xiàn)名*/stringfile_name;/*提取文本文獻(xiàn)中的信息。*/stringGetText();/*獲得一個(gè)單詞符號(hào),從位置i開始查找。并且有一個(gè)引用參數(shù)j,用來返回這個(gè)單詞最后一個(gè)字符在str的位置。*/stringGetWord(stringstr,inti,int&j);/*這個(gè)函數(shù)用來除去字符串中連續(xù)的空格和換行intDeleteNull(stringstr,inti);/*判斷i當(dāng)前所指的字符是否為一個(gè)分界符,是的話返回真,反之假*/boolIsBoundary(stringstr,inti);/*判斷i當(dāng)前所指的字符是否為一個(gè)運(yùn)算符,是的話返回真,反之假*/boo1Is0peration(stringstr,inti);/*此函數(shù)將一個(gè)pair數(shù)組輸出到一個(gè)文獻(xiàn)中*/voidOutFile(vector<pair<int,string>>v);/*此函數(shù)接受一個(gè)字符串?dāng)?shù)組,對(duì)它進(jìn)行詞法分析,返回一個(gè)pair型數(shù)組*/vector<pair<int,string>>analyst(vector<string>vec);/*此函數(shù)判斷傳遞的參數(shù)是否為關(guān)鍵字,是的話,返回真,反之返回假*/boo1IsKey(stringstr);2.各模塊設(shè)計(jì).一方面根據(jù)上面單詞符號(hào)表及ID和NUM的正規(guī)定義式,構(gòu)造出狀態(tài)轉(zhuǎn)換圖;.定義相關(guān)的變量和數(shù)據(jù)結(jié)構(gòu)。關(guān)鍵字作為特殊標(biāo)記符解決,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序辨認(rèn)出標(biāo)記符時(shí)\查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)記符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:charKEY_W0RDS[7]={"main",〃int〃,〃char","if",〃else",〃for","while〃};用以存放單詞符號(hào)二元式的數(shù)據(jù)結(jié)構(gòu)可如下定義:classWord_Analyzer(public:ocharContent[MAXLENGTH];intva1;voidprint();};.按照編譯程序一遍掃描的規(guī)定,把詞法分析器Scaner作為一個(gè)獨(dú)立的子程序來設(shè)計(jì),通過對(duì)Scaner的反復(fù)調(diào)用辨認(rèn)出所有的單詞符號(hào);.當(dāng)Scaner辨認(rèn)出一個(gè)單詞符號(hào)時(shí),則將該單詞符號(hào)的二元式寫入到輸出文獻(xiàn)中。若Scaner無法辨認(rèn)出一個(gè)單詞符號(hào)時(shí),則調(diào)用錯(cuò)誤解決程序PrintError,顯示當(dāng)前掃描到的字符及其所在行、列位置,并跳過該字符重新開始辨認(rèn)單詞符號(hào)。四、程序代碼include<iostream>include<vector>elude<string>incIude<fstream>0usingnamespacestd;0/*用來存儲(chǔ)目的文獻(xiàn)名*/stringfile_name;o/*提取文本文獻(xiàn)中的信息。*/stringGetText();/*獲得一個(gè)單詞符號(hào),從位置i開始查找。//并且有一個(gè)引用參數(shù)j,用來返回這個(gè)單詞最后一個(gè)字符在str的位置。*/ostringGetWord(stringstr,inti,int&j);0/*這個(gè)函數(shù)用來除去字符串中連續(xù)的空格和換行//第一個(gè)參數(shù)為目的字符串,第二個(gè)參數(shù)為開始位置//返回值為連續(xù)的空格和換行后的第一個(gè)有效字符在字符串的位置*/intDeleteNull(stringstr,inti);/*判斷i當(dāng)前所指的字符是否為一個(gè)分界符,是的話返
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥行業(yè)運(yùn)輸協(xié)議模板
- 體育館裝修終止合同協(xié)議書
- 商業(yè)街區(qū)改造開發(fā)居間合同
- 水上清潔服務(wù)合同范本
- 成品油內(nèi)河運(yùn)輸協(xié)議
- 校園食堂裝修工程合同
- 教室環(huán)保石膏吊頂裝修協(xié)議
- 保健食品居間代理協(xié)議
- 路塹石方爆破施工方案
- 合同范例不需審查
- 2024-2025學(xué)年第二學(xué)期學(xué)校全面工作計(jì)劃
- 2025年護(hù)士資格考試必考基礎(chǔ)知識(shí)復(fù)習(xí)題庫(kù)及答案(共250題)
- 2025年人教版PEP二年級(jí)英語(yǔ)上冊(cè)階段測(cè)試試卷
- 煙草業(yè)產(chǎn)業(yè)鏈協(xié)同創(chuàng)新模式-洞察分析
- 施工現(xiàn)場(chǎng)臨時(shí)水電布置操作手冊(cè)(永臨結(jié)合做法示意圖)
- 2024年廣西事業(yè)單位D類招聘考試真題
- 公文寫作與常見病例分析
- 2025年國(guó)家電投集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年中國(guó)南方航空招聘筆試參考題庫(kù)含答案解析
- 經(jīng)濟(jì)學(xué)基礎(chǔ)試題及答案 (二)
- 2024-2030年中國(guó)蠔肉市場(chǎng)發(fā)展前景調(diào)研及投資戰(zhàn)略分析報(bào)告
評(píng)論
0/150
提交評(píng)論