標(biāo)記語言的簡單解釋器算法C++實現(xiàn)_第1頁
標(biāo)記語言的簡單解釋器算法C++實現(xiàn)_第2頁
標(biāo)記語言的簡單解釋器算法C++實現(xiàn)_第3頁
標(biāo)記語言的簡單解釋器算法C++實現(xiàn)_第4頁
標(biāo)記語言的簡單解釋器算法C++實現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機軟件技術(shù)基礎(chǔ)作業(yè)標(biāo)記語言的簡單解釋器算法實現(xiàn)1、源程序見包內(nèi),經(jīng)檢測可以在 MS VC+ 6.0中正確運行。本次作業(yè),還添加了現(xiàn)場輸入 測試功能,顯得功能更加強大了。2、標(biāo)記語言的簡單解釋器算法實現(xiàn),在本題中是通過構(gòu)造樹和堆棧實現(xiàn)的。3、算法思路:讀取壓入的字符串,如果讀到一個新的<> 組合,則把它添加到子列中,如果讀到了 </>組合,則與原有數(shù)據(jù)進行匹配,如果讀到標(biāo)記的值就把數(shù)據(jù)直接放到樹中去,其他情 況就跳出循環(huán)直接輸出樹的內(nèi)容。本題考慮到可以換行輸入,所以計算了''和'的數(shù)目,如果<'剛好是T就表明XML語言就要結(jié)束了!

2、4、數(shù)據(jù)結(jié)構(gòu)說明本程序使用了數(shù)和指針的結(jié)構(gòu),期間多次使用到了數(shù)組。5、程序流程說明6程序運行的驗證過程(1)導(dǎo)入文件(2)直接輸入代碼(3 )括號不匹配情況(4 )其它選項S3,rG : ¥i sual 匚卄 6. Owang:M)ebugwaiig. exe1*_! x|導(dǎo)入文件請按1,即時輸入即L標(biāo)記語宮請按,卽,退岀請按其他撫: t血您選擇了退出歡迎您下級的使用M ? Press Qin* key to continue7、效果分析本程序不但可以讀取文件,而且可以直接從屏幕輸入XML語言,方便易行,并且能夠進行基本的括號匹配檢查,可以作為簡單的標(biāo)記語言解釋器進行使用。&

3、原創(chuàng)內(nèi)容及體會剛開始編寫這個程序時我真的是了無頭緒,后來想到可以用一個字符串?dāng)?shù)組傳遞所需要的字符串內(nèi)容,并且篩選掉不必要的空格符和換行符,于是思路就豁然開朗了,我的編寫過程是首先屏幕直接輸入輸出進行檢驗,這一步做好之后,我離成功就不遠了,接下來就是導(dǎo)入文件的問題了,通過文件指針和fgetc()函數(shù),我很快地解決了這個問題,反思整個編寫過程,我發(fā)現(xiàn)最讓我耗時的地方還是數(shù)組和字符串之間的賦值問題,原來數(shù)組使用了 gets(數(shù)組名)就能夠很方便地轉(zhuǎn)化為字符串了!另外由于首尾標(biāo)記名稱和標(biāo)記值可以分行寫,這就要考慮什么時候停止讀入字符的問題了。通過仔細觀察,我發(fā)現(xiàn)當(dāng)符號<'的數(shù)量剛好是符號

4、7'的兩倍時,一按下回車鍵就是停止讀入數(shù)據(jù)之時,就這樣我把該解決的問題一個一個地解決掉了!以下是我的最終成果,“軟件2.cpp”:#in elude <iostream>#in elude <stri ng>#in elude <vector>#in elude <stack>using n amespace std;class Tree創(chuàng)建一個樹的類public:Tree(stri ng n ame)n=n ame;val=""no=+am ount;string Name()return n;void SetVal

5、(stri ng value)val=value;/ 設(shè)置元素內(nèi)容void AddChild(Tree *p)child.push_back(p);/ 添加子樹名稱void Print()/輸出第 n 個元素的有關(guān)內(nèi)int i; cout<<"Element "<<no<<" - "<<n<<" : " if(val.size()=0) cout<<"null"else cout<<val;cout<<", c

6、hild: "if(child.size()=0) cout<<"null"<<endl;elsefor(i=0;i<child.size();+i) cout<<"Element "<<childi->no<<" "cout<<endl;for(i=0;i<child.size();+i)childi->Print();static int amount; / 用來統(tǒng)計元素個數(shù)的靜態(tài)變量 private:string n;/樹中

7、記錄元素名字string val;/ 樹中記錄元素內(nèi)容int no;/ 樹中統(tǒng)計元素個數(shù)vector<Tree*> child; / 樹中用于記錄子樹;int Tree:amount=0; char buf80;int GetHead(char *xml)/tree 域內(nèi)的 amount 賦值為 0/ 創(chuàng)建一個 buf 數(shù)組/獲取標(biāo)記頭, 從 '<' 開始取遇到 '>' 為止字符串return (ssca nf(xml,"<%F>>",buf)=1);int GetVal(char *xml)/ 獲取

8、數(shù)據(jù),取遇到 '<' 為止字符串return (ssca nf(xml,"%F<",buf)=1);int GetTail(char *xml)/獲取標(biāo)記尾, 從 '<' 開始取遇到 '>' 為止字符串return (ssca nf(xml,"</%F>>",buf)=1);void cut(char *xml,int len)if(strlen(xml)>len)sprintf(xml,"%s",xml+len);elsestrcpy(x

9、ml,"");int main()char start800 ,n ,lujing100; int i=0,kuo=0,kuo2=0,gang=0,k=0; FILE *fp; cout<<" 導(dǎo)入 XML 文件請按 '1' ,即時輸入 XML 標(biāo)記語言請按 '2' ,退出請按其他鍵 "<<endl;cin>>n; getchar();cout<<endl;if(n='1')cout<<" 請輸入文件路徑: "<<e

10、ndl;gets(lujing); cout<<endl;/if(fp=fopen("test.xml","r")=NULL)/ 此行決定所導(dǎo)入文件的來源 ( 如:d:test.xml) !沒有路徑則表示出處在源程序所在文件夾中。if(fp=fopen(lujing,"r")=NULL) cout<<"File open error!"<<endl; exit(0);cout<<" 您導(dǎo)入的文件內(nèi)容是: "<<endl;while(!f

11、eof(fp) start-1='0' starti=fgetc(fp); /先使用一個數(shù)組 start800 存儲數(shù)據(jù),判別程 序是否結(jié)束cout<<starti; if(starti='<') kuo+;else if(starti='>') kuo2+;else if(starti='/') gang+;else;if(kuo=gang*2 && starti='>') break;else if(kuo!=2*gang&&starti='

12、n');else if(starti=' ');else i+;if(kuo2<kuo-1|kuo2>kuo)cout<<" 括號不匹配! "<<endl;/cout<<"2"<<endl;exit(0);/starti=fgetc(fp);/cout<<starti;/i+;if(starti!='>')cout<<endl<<endl<<" 此文件括號不匹配! "<<

13、endl;/cout<<"2"<<endl;exit(0);cout<<endl;if(fclose(fp)cout<<"Can not close the file!"<<endl;exit(0);else if(n='2')/在這種模式下,可以通過屏幕輸出XML 語言!cout<<" 請輸入 XML 語言, 首尾標(biāo)記名稱和標(biāo)記符可以分行寫 , 注意括號要匹 配: "<<endl;start-1='0'while(k!

14、=1)starti=getchar(); /先使用一個數(shù)組 start800 存儲數(shù)據(jù),判別程序 是否結(jié)束if(starti='<')kuo+;else if(starti='>')kuo2+;else if(starti='/')gang+;else;if(kuo=gang*2 && starti-1='>' &&starti='n')k=1; i+;else if(kuo=gang*2 && starti-1!='>' &a

15、mp;&starti='n')cout<<" 括號不匹配! "<<endl;/cout<<"1"<<endl;exit(0);else if(kuo!=2*gang&&starti='n');else if(starti=' ');elsei+;if(kuo2<kuo-1|kuo2>kuo)cout<<" 括號不匹配! "<<endl;/cout<<"2&qu

16、ot;<<endl;exit(0);else/按其他鍵則退出!cout<<" 您選擇了退出 ,歡迎您下次的使用 !"<<endl;exit(0);char xml800;strcpy(xml,start);/gets(xml);/strcpy(xml,"<class><student><name>ABC</name><id>123456</id>group1</student></class>");/puts(xml);co

17、ut<<endl<<" 以下是解釋語言: "<<endl;Tree *root=NULL,*p,*q;stack<Tree*> S; / 定義堆棧while(1)if(GetTail(xml)/ 到達樹根if(S.empty()cerr<<"expect <tag>"<<endl;break;if(S.top()->Name()=string(buf)S.pop();if(!S.empty() p=S.top(); else break;elsecerr<<"not match"<<endl; break;cut(xml,strlen(buf)+3);else if(GetHead(xml)/ 到達樹頭q=new Tree(string(buf);if(root=NULL)p=root=q

溫馨提示

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

評論

0/150

提交評論