




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計(jì)報(bào)告( 2010 - 2011年度第 1 學(xué)期)名 稱: 編譯技術(shù)課程設(shè)計(jì)B 題 目: 詞法分析器設(shè)計(jì) 算符優(yōu)先分析程序設(shè)計(jì) 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計(jì) 院 系: 計(jì)算機(jī)系 班 級: 計(jì)科1001 學(xué) 號: 2010090101* 學(xué)生姓名: 指導(dǎo)教師 設(shè)計(jì)周數(shù): 1周 成 績: 日期:2013年1月9日2一、課程設(shè)計(jì)的目的與要求1.1 詞法分析器設(shè)計(jì)的實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)是為計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個實(shí)驗(yàn),使學(xué)生應(yīng)用編譯程序設(shè)計(jì)的原理和技術(shù)設(shè)計(jì)出詞法分析器,了解掃描器的組成結(jié)構(gòu),
2、不同種類單詞的識別方法。能使得學(xué)生在設(shè)計(jì)和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計(jì)、分析編譯程序打下良好的基礎(chǔ)。1.2 詞法分析器設(shè)計(jì)的實(shí)驗(yàn)要求設(shè)計(jì)一個掃描器,該掃描器是一個子程序,其輸入是源程序字符串,每調(diào)用一次識別并輸出一個單詞符號。為了避免超前搜索,提高運(yùn)行效率,簡化掃描器的設(shè)計(jì),假設(shè)該程序設(shè)計(jì)語言中,基本字(也稱關(guān)鍵詞)不能做一般標(biāo)識符用,如果基本字、標(biāo)識符和常數(shù)之間沒有確定的運(yùn)算符或界符作間隔,則用空白作間隔。單詞符號及其內(nèi)部表示如表1-1所示,單詞符號中標(biāo)識符由一個字母后跟多個字母、數(shù)字組成,常數(shù)由多個十進(jìn)制數(shù)字組成。單詞符號的內(nèi)部表示,即單詞的輸出形式為二元式:(種別編碼,單詞
3、的屬性值)。表1-1單詞符號及其內(nèi)部表示單詞符號種別編碼單詞的屬性值BEGINIFTHENELSEEND標(biāo)識符整型常數(shù)+*()123456789101112在名字表中的地址十進(jìn)制整數(shù)2算符優(yōu)先分析程序設(shè)計(jì)的目的和要求2.1 算符優(yōu)先分析程序設(shè)計(jì)的實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)是為計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個實(shí)驗(yàn),使學(xué)生應(yīng)用編譯程序設(shè)計(jì)的原理和技術(shù), 設(shè)計(jì)、編寫和調(diào)試算符優(yōu)先分析程序,了解算符優(yōu)先分析程序的組成結(jié)構(gòu),掌握實(shí)現(xiàn)通用算符優(yōu)先分析算法的方法。能使得學(xué)生在設(shè)計(jì)和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計(jì)、分析編
4、譯程序打下良好的基礎(chǔ)。2.2 算符優(yōu)先分析程序設(shè)計(jì)的實(shí)驗(yàn)要求算符優(yōu)先分析屬于自下而上的分析方法,該語法分析程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入串是句子則輸出“YES”,否則輸出“NO”和錯誤信息。算符優(yōu)先分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用,本題目給出文法的目的是為了便于對語法分析結(jié)果進(jìn)行驗(yàn)證。(1)文法設(shè)算符優(yōu)先文法為: 說明:i為整型常數(shù)或者為標(biāo)識符表示整型變量;使用中用*表示。(2)優(yōu)先關(guān)系表設(shè)優(yōu)先關(guān)系表如表1-2所示。表1-2優(yōu)先關(guān)系表+ * i ( ) # + * i ( ) # 3基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)
5、計(jì)的目的和要求3.1 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計(jì)的實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)是為計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個實(shí)驗(yàn),使學(xué)生應(yīng)用編譯程序設(shè)計(jì)的原理和技術(shù), 通過設(shè)計(jì)、編寫和調(diào)試語法制導(dǎo)翻譯程序,掌握從一種語句的語法和語義出發(fā),構(gòu)造相應(yīng)的語義子程序,實(shí)現(xiàn)基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯的方法。能使得學(xué)生在設(shè)計(jì)和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計(jì)、分析編譯程序打下良好的基礎(chǔ)。3.2 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計(jì)的實(shí)驗(yàn)要求算符優(yōu)先分析方法是通過反復(fù)把輸入符號移進(jìn)分析棧,使用優(yōu)先關(guān)系表
6、在分析棧頂尋找最左素短語,將其歸約為一個非終結(jié)符號而實(shí)現(xiàn)的。這個分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用(所以本題目無需給出文法)。基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯是在算符優(yōu)先語法分析的基礎(chǔ)上進(jìn)行翻譯工作(即語義分析),每當(dāng)將一個最左素短語歸約為一個非終結(jié)符號時,就調(diào)用對應(yīng)產(chǎn)生式的語義子程序,去完成相應(yīng)的語義翻譯工作,這步歸約使用的產(chǎn)生式對非終結(jié)符號不加區(qū)分(即將所有的非終結(jié)符號用一個通用的非終結(jié)符號表示)。語法制導(dǎo)翻譯程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入符號串是句子,則按照其語義進(jìn)行翻譯,輸出等價(jià)的四元式序列(作為練習(xí)應(yīng)顯示輸出)。
7、4上機(jī)前的準(zhǔn)備為了充分利用上機(jī)時間,在進(jìn)行編譯技術(shù)上機(jī)實(shí)驗(yàn)前應(yīng)做好各種準(zhǔn)備工作,具體應(yīng)包括:(1)復(fù)習(xí)與上機(jī)題目有關(guān)的知識,熟悉有關(guān)定義、概念和實(shí)現(xiàn)算法。(2)設(shè)計(jì)出程序流程框圖和數(shù)據(jù)結(jié)構(gòu),編寫出完整的源程序,進(jìn)行靜態(tài)檢查。(3)為所編寫的程序構(gòu)思一個運(yùn)行、調(diào)試環(huán)境,例如,以什么方式提供輸入數(shù)據(jù)、顯示輸出數(shù)據(jù),如何調(diào)用(或啟動)編寫的程序。制定出程序調(diào)試計(jì)劃和典型輸入代碼數(shù)據(jù)。二、課程設(shè)計(jì)正文1 詞法分析器設(shè)計(jì)11 狀態(tài)轉(zhuǎn)換圖 實(shí)驗(yàn)分析:如上面的狀態(tài)轉(zhuǎn)換圖所示,詞法分析器的設(shè)計(jì)思路比較簡單,但是要注意對空格的“過濾”,需要對字符進(jìn)行判斷,若為空格則指針向后移動。此外如果查找單詞時起始是字母則下
8、一步若連續(xù)的是字母或者數(shù)字都會構(gòu)成標(biāo)識符,但是如果開始是數(shù)字那么則必須與字符連續(xù)的是數(shù)字才是常數(shù),否則常數(shù)的單詞已經(jīng)結(jié)束,進(jìn)行下一步單詞的分析。對于界符和運(yùn)算符的的分析只需判斷單個字符即可,對于已經(jīng)存入的關(guān)鍵字,需要通過查表操作來完成。實(shí)驗(yàn)中使用的主要的數(shù)據(jù)結(jié)構(gòu):node結(jié)構(gòu)體表示每個表項(xiàng)的屬性,graph表示名字表和常數(shù)表,關(guān)鍵字表用數(shù)組存儲。算法簡要概述:采用一個字符串Strtoken來存儲分析的單詞,若未分析完則將正在處理的字符連接到Strtoken后面,若當(dāng)前單詞分析完,則重新對Strtoken進(jìn)行賦值,直至整個句子全部分析完成。附錄(設(shè)計(jì)流程圖、程序、運(yùn)行結(jié)果等1詞法分析器設(shè)計(jì) (1
9、)流程圖 開始輸入字符串過濾空格初始化StrToken判斷當(dāng)前字符是字母嗎?YN下一個字符為數(shù)字或字母,且字符串未結(jié)束?StrToken為關(guān)鍵字?存入標(biāo)識符表NYYY連接到StrToken上為界符或運(yùn)算符?為數(shù)字嗎?出錯NN下一個字符為數(shù)字且字符串未結(jié)束?YY輸出字符串處理完成?Y查找下一個字符連接到StrToken上Y結(jié)束N #include<iostream>#include<string.h>using namespace std;/引皔進(jìn)?一?組哩?全?局?變?量?和í過y程ìchar *word="BEGIN",&quo
10、t;IF","THEN","ELSE","END"/the sign word char *StrToken=new char30; /the word requiring deal withchar String50; /the input stringint point=0; /the string pointerchar ch; /get the letterint ip=0; /the identifer pointerint cp=0; /the const pointertypedef struct node /
11、the struct of the node of the tablechar Sign100; int kind;int rank;public: node()for(int i=0;i<100;i+)Signi=' 'this->kind=0;this->rank=0;void Set(char Sign,int kind,int &rank)strcpy(this->Sign,Sign);this->kind=kind;this->rank=rank;Node;typedef struct table /the struct t
12、ableNode *item100;int top; public: table() top=0; void insert(Node *it) itemtop=it; top+; void Disp() int i; if(top=0) cout<<"此?表括?為a空?!"<<endl; for(i=0;i<top;i+) cout<<itemi->Sign<<'t'<<itemi->kind<<'t'<<itemi->rank+1&l
13、t;<endl; cout<<"-"<<endl; table;table *Iden=(table *)new table;/ the indetifer tabletable *Const=(table *)new table;/the const tablevoid Readc(char &ch,char c);/讀á取?一?個?字?符?bool GetBC(char c);/判D斷?是?否?為a空?字?符?bool IsLetter(char c);/判D斷?是?否?為a字?符?bool IsDigit(char c)
14、;/判D斷?是?否?為a數(shù)簓字?int Reserve(char *StrToken);/判D斷?是?否?為a關(guān)?鍵ü字?并為a對?應(yīng)畖的?關(guān)?鍵ü字?(輟?保饋?留?字?)?分?配?種?別纄編括?碼?int Op(char c);/為a每?種?單蹋?詞洙?符?號?分?配?類?型í(輟?種?別纄編括?碼?)?void Concat(char *StrToken,char in);/將?CH鏈?接ó到?StrToken中D去?,?,?connat a signal to a stringvoid main()int i;cout<<"
15、請?輸?入?一?個?語?句?(以? '#'結(jié)á尾2):"<<endl;cin.getline(String,50);/int length=strlen(String);/實(shí)害?際ê語?句?長¤度ècout<<"詞洙?法?分?析?結(jié)á果?:阰"<<endl;cout<<"單蹋?詞洙?符?號? "<<" 種?別纄編括?碼? "<<" 屬?性?值(輟?內(nèi)ú碼?值)?&quo
16、t;<<endl; while(GetBC(Stringpoint)point+;/若?是?空?,?繼ì續(xù)?往?前°找ò第臺?下?一?個?字?符?i=point; do while(GetBC(Stringi) i+; point=i; Readc(ch,Stringi); char *te=new char2; te0=ch; strcpy(StrToken,te);/把?te所ù指?由ULL結(jié)á束?的?字?符?串?復(fù)制?到?StrToken所ù指?的?數(shù)簓組哩?中D。 StrToken1='0' if
17、(IsLetter(Stringi)/the first is letter int j=i+1; while(IsLetter(Stringj)|IsDigit(Stringj)&&j<length) Concat(StrToken,Stringj); StrTokenj-i+1='0' j+;if(Reserve(StrToken) cout<<"-"<<endl;cout<<"|< "<<StrToken<<'t'<<
18、't'<<Reserve(StrToken)<<'t'<<'t'<<"->|"<<endl;elseNode *node=(Node *)new Node;node->Set(StrToken,6,ip);/創(chuàng)洹?建¨一?個?狀痢?態(tài)?節(jié)ú點(diǎn)? Iden->insert(node);/放?在ú字?符?表括?中Dcout<<"-"<<endl; cout<<"
19、;|< "<<StrToken<<'t'<<'t'<<"6"<<'t'<<'t'<<+ip<<" >|"<<endl; /標(biāo)括?識?符?的?種?別纄編括?碼?是?6i=j; / end letter else if(IsDigit(Stringi)/ 如?果?第臺?一?個?字?符?為a數(shù)簓字? int j=i+1; while(IsDigit(Stringj)&a
20、mp;& j<length) Concat(StrToken,Stringj);/concat to strTokenStrTokenj-i+1='0'j+; Node *node=(Node *)new Node;/為a數(shù)簓字?創(chuàng)洹?建¨一?個?節(jié)ú點(diǎn)?,?node->Set(StrToken,7,cp);/把?該?節(jié)ú點(diǎn)?放?入?常數(shù)簓表括?中D Const->insert(node);cout<<"-"<<endl;cout<<"|< "
21、;<<StrToken<<'t'<<'t'<<"7"<<'t'<<'t'<<+cp<<" >|"<<endl; i=j; /end digit else if(Op(Stringi)/ 判D斷?是?否?為a操ù作痢?符?或ò分?隔?符? switch (Op(Stringi) case 8: case 9: case 12: case 13: case 14:
22、 cout<<"-"<<endl; cout<<"|< "<<StrToken<<'t'<<'t'<<Op(Stringi)<<'t'<<'t'<<"->|"<<endl;break; case 10: if(Stringi+1='*') i+; Concat(StrToken,'*'); cout
23、<<"-"<<endl; cout<<"|< "<<StrToken<<'t'<<11<<'t'<<'t'<<"->|"<<endl; else cout<<"-"<<endl; cout<<"|< "<<StrToken<<'t'<
24、;<'t'<<Op(Stringi)<<'t'<<'t'<<"->|"<<endl; break; i+; / end op else /other i+;cout<<"-"<<endl;cout<<"|< "<<StrToken<<'t'<<'t'<<"無T此?種?單蹋?詞洙?符?號?
25、。>|"<<endl; while(Stringi!='#');cout<<"-"<<endl;cout<<"|< #"<<'t'<<'t'<<0<<'t'<<'t'<<"->|"<<endl;cout<<"-"<<endl;cout<<&qu
26、ot;-字?符?表括?-"<<endl;Iden->Disp();cout<<"*"<<endl;cout<<"-常數(shù)簓表括?:阰-"<<endl;Const->Disp();cout<<"*"<<endl;system("pause");void Readc(char &ch,char c)/讀á取?一?個?字?符?ch=c;bool GetBC(char c)/判D斷?是?否?為a空?字?
27、符?if (c=' ')return true;elsereturn false;bool IsLetter(char c)/判D斷?是?否?為a字?符?if (c>='a')&&(c<='z') | (c>='A')&&(c<='Z')return true;else return false;bool IsDigit(char c)/判D斷?是?否?為a數(shù)簓字?if (c>='0')&&(c<='9
28、9;)return true;elsereturn false;int Reserve(char *StrToken)/判D斷?是?否?為a關(guān)?鍵ü字?并為a對?應(yīng)畖的?關(guān)?鍵ü字?(輟?保饋?留?字?)?分?配?種?別纄編括?碼?int i;for(i=0;i<5;i+)if(!strcmp (StrToken,wordi)return i+1;return 0;int Op(char c)/為a每?種?單蹋?詞洙?符?號?分?配?類?型í(輟?種?別纄編括?碼?)?switch(c)case '=':return 8;break;case
29、 '+':return 9;break;case '*':return 10;break;case ',':return 12;break;case '(':return 13;break;case ')':return 14;break;default :return 0;break;void Concat(char *StrToken,char in)/將?CH鏈?接ó到?StrToken中D去?,?,?connat a signal to a string char *temp=new char1;
30、temp0=in;strcat(StrToken,temp); (3)運(yùn)行結(jié)果 2 算符優(yōu)先分析程序設(shè)計(jì)實(shí)驗(yàn)分析:算符優(yōu)先分析屬于自下而上的分析方法,在分析的過程中需要借助于優(yōu)先關(guān)系表,在分析過程中通過查找優(yōu)先關(guān)系表和分析棧的共同作用來進(jìn)行分析。實(shí)驗(yàn)中使用的主要的數(shù)據(jù)結(jié)構(gòu):用一個二維數(shù)組cost來存儲優(yōu)先關(guān)系表,構(gòu)造一個棧類stack用來作為分析時的處理工具。 算法簡要概述:算法的具體思路為,首先將分析棧壓入“#”,然后對字符串進(jìn)行遍歷,邊遍歷邊比較當(dāng)發(fā)現(xiàn)棧頂終結(jié)符的優(yōu)先級的低于或等于正在考察的字符時,字符入棧,當(dāng)發(fā)現(xiàn)棧頂?shù)慕K結(jié)符的優(yōu)先級高于正在考察的字符時要進(jìn)行規(guī)約,規(guī)約的具體方法是從棧頂往
31、棧底方向查當(dāng)發(fā)現(xiàn)第一個優(yōu)先級低于棧頂終結(jié)符時查找結(jié)束,記錄當(dāng)前位置,然后從棧頂?shù)皆摻K結(jié)符的上一個位置規(guī)約為一個“N”,依次類推,當(dāng)分析棧最終出現(xiàn)“#N#”則證明輸入串是句子,否則不是,分析完成。2算符優(yōu)先分析程序設(shè)計(jì) (1)流程圖 當(dāng)前字符為# ?#壓棧輸入字符串輸出優(yōu)先關(guān)系表開始棧中為“#N#”不是句子YNN大于?棧頂終結(jié)符與當(dāng)前字符比較結(jié)束是句子出棧YN入棧下一個字符規(guī)約Y(2)程序#include<iostream>#include<string>using namespace std;const int MAX=100;/#define NUM=100/定
32、68;義?全?局?變?量?及°函數(shù)簓char cost88=' ','+','*','','i','(',')','#', '+','>','<','<','<','<','>','>', '*','>','>','<
33、','<','<','>','>', '','>','>','<','<','<','>','>', 'i','>','>','>',' ',' ','>','>', '
34、;(','<','<','<','<','<','=',' ', ')','>','>','>',' ',' ','>','>', '#','<','<','<','<','<
35、;',' ','='/任?務(wù)?書酣?上?文?法?的?算?法?優(yōu)?先è關(guān)?系表括?int static top=0;char ArrayMAX;char GetTop();/讀á取?void PushStack(char c);/入?棧?char *PopStack(int length);/=退?棧?返?回?被?規(guī)?約?的?那?部?分?字?符?=char GetChar(int pos);/讀á取?棧?里?的?字?符?void DispStack();/顯?示?棧?里?的?字?符?,?用?于?調(diào)獺?試?bool IsVT(c
36、har c);/判D斷?字?符?是?否?為a終?結(jié)á符?bool Num_Char(char c);/是?否?為a字?母?或ò是?數(shù)簓字?int SearchCost(char ch1,char ch2);/根ù據(jù)Y優(yōu)?先è關(guān)?系表括?找ò出?兩?字?符?的?優(yōu)?先è關(guān)?系 /0=e“°=”± ,?1=“°>”±,?-1="<",?2=NULLvoid main()char stringMAX; /for the sentence to be ananlysech
37、ar *ch=new char MAX; /the mergeing stringPushStack('#');/init the stack char a; /store the letter need to be judgeint strp; /point to the letter of the stringint statop; /point to the top of the stackint statopvt; /point to the top VT/cout<<"*"<<endl;cout<<"請
38、?輸?入?一?個?運(yùn)?算?語?句? (以? '#'結(jié)á束?)"<<endl;cin.getline(string,MAX); /cout<<"棧?里?:"<<'t'<<"語?義?動作痢?<<endl;a=string0; /init the pointersstrp=0;statop=top-1;statopvt=statop;while(a!='#') /The analysing progress is as following: /
39、if the letter's priority is litter than the top start merge a=stringstrp; / get the letterif(a='*')&&(stringstrp+1='*') a=''strp+;if(IsVT(GetChar(statop)statopvt=statop;else statopvt=statop-1; /if the letter's priority is greater than the top the push itwhile(
40、IsVT(a)&&(SearchCost(GetChar(statopvt),a)=1)/遇?到?大洙?于?號?說明÷到?了?最?左哩?素?短ì語?的?尾2部?,?,?進(jìn)?行D規(guī)?約?處鋦理?/DispStack(); /show the stack before mergingint poiterH=statopvt;int poiterN=poiterH-1; /計(jì)?算?出?需è要癮規(guī)?約?的?長¤度èlengthif(!IsVT(GetChar(poiterN)poiterN-; while(SearchCost(GetC
41、har(poiterN),GetChar(poiterH)!=-1)poiterH=poiterN;poiterN-;if(!IsVT(GetChar(poiterN)poiterN-;int start=top;poiterN+; int length=start-poiterN;strcpy(ch,PopStack(length);PushStack('N');/*cout<<"規(guī)?約?:"for(int i=0;i<length;i+)if(chi='')cout<<"*"elsecou
42、t<<chi;*/*cout<<"=>"<<'N'<<endl;*/statopvt=top-1;if(!IsVT(GetChar(statopvt)statopvt-; if (!(a>='A')&&(a<='Z')&&(SearchCost(GetChar(statopvt),a)=2)cout<<"Error!"<<endl;cout<<"The "
43、<<strp+1<<" letter is wrong!"<<endl;cout<<"NO!"<<endl;system("pause");exit(0);else/*DispStack();if(a='')cout<<"把? "<<"*"<<" 入?棧?。"<<endl;elsecout<<"把? "<<a&
44、lt;<"入?棧?。"<<endl;*/PushStack(a);strp+;statop=top-1;/DispStack();PopStack(3);if(top=0)cout<<"YES!"<<endl;elsecout<<"NO!"<<endl;system("pause"); char GetTop()/讀á取?return Arraytop-1; void PushStack(char c)/入?棧?if(top<MAX)
45、 Arraytop+=c;elsecout<<"over flow!"<<endl; char *PopStack(int length)/=退?棧?返?回?被?規(guī)?約?的?那?部?分?字?符?=if(top>=length)char *temp=new charMAX;int j=0; for(int i=0;i<length;i+)tempi=Arraytop-length+i;j=i; top=top-length;tempj='0' return temp; elsereturn NULL; bool IsVT(c
46、har c)/判D斷?字?符?是?否?為a終?結(jié)á符?bool flag=false;for(int i=0;i<8;i+)if(c=cost0i)flag=true;if (c>='a')&&(c<='z') | (c>='0')&&(c<='9')flag=true;return flag; char GetChar(int pos)/讀á取?棧?里?的?字?符?if(pos>=0)&&(pos<MAX)return
47、Arraypos;elsereturn '0' bool Num_Char(char c)/是?否?為a字?母?或ò是?數(shù)簓字?if (c>='a')&&(c<='z') | (c>='0')&&(c<='9') return true;elsereturn false; int SearchCost(char ch1,char ch2)/根ù據(jù)Y優(yōu)?先è關(guān)?系表括?找ò出?兩?字?符?的?優(yōu)?先è關(guān)?系 /0
48、=e“°=”± ,?1=“°>”±,?-1="<",?2=NULLint i,j;if(Num_Char(ch1)ch1='i'if(Num_Char(ch2)ch2='i'switch(ch1)case '+':i=1;break;case '*':i=2;break;case '':i=3;break;case 'i':i=4;break;case '(':i=5;break;case ')'
49、:i=6;break;case '#':i=7;break;switch(ch2)case '+':j=1;break;case '*':j=2;break;case '':j=3;break;case 'i':j=4;break;case '(':j=5;break;case ')':j=6;break;case '#':j=7;break;switch(costij)case '>':return 1;break;/1表括?示?大洙?于?ca
50、se '<':return -1;break;/-1表括?示?小?于?case '=':return 0;break;default:return 2;break;/非?法?語?句? void DispStack()/顯?示?棧?里?的?字?符?,?用?于?調(diào)獺?試?for(int i=0;i<top;i+)if (GetChar(i)='')/-cout<<"*"cout<<'b'elsecout<<GetChar(i);if (top>=8)cout&l
51、t;<'t'else cout<<'t'<<'t'(3)運(yùn)行結(jié)果 1)正確情況下2)不正確的情況下:3 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序的設(shè)計(jì)實(shí)驗(yàn)分析:在算符優(yōu)先分析的基礎(chǔ)上進(jìn)行制導(dǎo)翻譯,程序的執(zhí)行過程大體一樣,只是在進(jìn)行規(guī)約時多了產(chǎn)生式的處理,在上一次試驗(yàn)中由于只需要判斷是否為句子,所以只需規(guī)約成“N”即可,但是本次實(shí)驗(yàn)要求輸出產(chǎn)生式,所以不能簡單的將其規(guī)約為一個“N”而應(yīng)該對規(guī)約成的內(nèi)容加以區(qū)分,可以采用將字符映射成數(shù)字的方法,這樣就可以產(chǎn)生不同的“N”,便于完成產(chǎn)生式的處理。實(shí)驗(yàn)中使用的主要的數(shù)據(jù)結(jié)構(gòu):如
52、上實(shí)驗(yàn)對于優(yōu)先分析的數(shù)據(jù)結(jié)構(gòu):用一個二維數(shù)組cost來存儲優(yōu)先關(guān)系表,構(gòu)造一個棧類stack用來作為分析時的處理工具。此外,用一個類four_item來存儲四元式,實(shí)驗(yàn)中的字符存儲以及存儲字符映射的數(shù)字的數(shù)據(jù)結(jié)構(gòu)采用數(shù)組,并各自設(shè)置整數(shù)型的指針。算法簡要概述:33基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序的設(shè)計(jì) (1)流程圖 當(dāng)前字符為# ?#壓棧輸入字符串輸出優(yōu)先關(guān)系表開始棧中為“#N#”不是句子YNN大于?棧頂終結(jié)符與當(dāng)前字符比較結(jié)束是句子出棧YN入棧規(guī)約Y判斷產(chǎn)生式類型為前三個產(chǎn)生式?Y生成產(chǎn)生式下一個字符 (2)程序#include<iostream>#include<s
53、tring.h>using namespace std;/引皔進(jìn)?一?組哩?全?局?變?量?和í過y程ìconst int MAX=100;/char *word="BEGIN","IF","THEN","ELSE","END"/the sign word char *StrToken=new char30; /the word requiring deal with/char String50; /char StringMAX; /the input stringin
54、t point=0; /詞洙?法?分?析?分?析?字?符?串?時骸?指?向ò字?符?的?指?針?,?,?/char ch0; /get the letterint ip=0; /用?于?給?字?符?表括?計(jì)?數(shù)簓int cp=0; /用?于?給?常數(shù)簓表括?計(jì)?數(shù)簓typedef struct node /the struct of the node of the table/char Sign100; char Sign;int kind;int rank;public: node()/for(int i=0;i<100;i+)/Signi=' 'Sign=&
55、#39; 'this->kind=0;this->rank=0;void Set(char Sign,int kind,int &rank)/strcpy(this->Sign,Sign);this->Sign=Sign;this->kind=kind;this->rank=rank;Node;typedef struct table /the struct tableNode *item100;int top1; public: table() top1=0; void insert(Node *it) itemtop1=it; top1+; void
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- D打印技術(shù)在個性化教育資源的開發(fā)考核試卷
- 期刊出版論文的開源出版趨勢考核試卷
- 教育音像制品策劃與制作考核試卷
- 文具行業(yè)個性化服務(wù)考核試卷
- 工業(yè)園區(qū)電動汽車充電需求分析考核試卷
- 健康生活方式與營養(yǎng)健康考核試卷
- 個人培訓(xùn)課件大全
- 買杭州新房合同范本
- 私人店鋪?zhàn)赓U合同范本
- 2025屆吉林省吉林地區(qū)高三上學(xué)期二模英語試題及答案
- GB/T 15934-2008電器附件電線組件和互連電線組件
- GA/T 765-2020人血紅蛋白檢測金標(biāo)試劑條法
- 第2章-西周-春秋戰(zhàn)國時期的音樂-1-3節(jié)課件
- 提高白云石配比對燒結(jié)生產(chǎn)的影響
- 公安基礎(chǔ)知識考試題庫(含各題型)
- 選礦試車方案
- 小課題專題研究參考題目
- 《最好的未來》合唱曲譜
- GB∕T 8081-2018 天然生膠 技術(shù)分級橡膠(TSR)規(guī)格導(dǎo)則
- 教學(xué)課件個人理財(cái)-2
- 航空航天概論(課堂PPT)
評論
0/150
提交評論