




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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í): 網(wǎng)絡(luò)0802 學(xué) 號(hào): 學(xué)生姓名: 指導(dǎo)教師: 設(shè)計(jì)周數(shù): 1周 成 績(jī): 日期:2010年12月31一、課程設(shè)計(jì)的目的與要求1詞法分析器設(shè)計(jì)的目的與要求1.1 詞法分析器設(shè)計(jì)的實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)是為計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對(duì)課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個(gè)實(shí)驗(yàn),使學(xué)生應(yīng)用編譯程序設(shè)計(jì)的原理和技術(shù)設(shè)計(jì)出詞法分析器,了解掃描器的組成結(jié)構(gòu),
2、不同種類單詞的識(shí)別方法。能使得學(xué)生在設(shè)計(jì)和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計(jì)、分析編譯程序打下良好的基礎(chǔ)。1.2 詞法分析器設(shè)計(jì)的實(shí)驗(yàn)要求設(shè)計(jì)一個(gè)掃描器,該掃描器是一個(gè)子程序,其輸入是源程序字符串,每調(diào)用一次識(shí)別并輸出一個(gè)單詞符號(hào)。為了避免超前搜索,提高運(yùn)行效率,簡(jiǎn)化掃描器的設(shè)計(jì),假設(shè)該程序設(shè)計(jì)語言中,基本字(也稱關(guān)鍵詞)不能做一般標(biāo)識(shí)符用,如果基本字、標(biāo)識(shí)符和常數(shù)之間沒有確定的運(yùn)算符或界符作間隔,則用空白作間隔。單詞符號(hào)及其內(nèi)部表示如表1-1所示,單詞符號(hào)中標(biāo)識(shí)符由一個(gè)字母后跟多個(gè)字母、數(shù)字組成,常數(shù)由多個(gè)十進(jìn)制數(shù)字組成。單詞符號(hào)的內(nèi)部表示,即單詞的輸出形式為二元式:(種別編碼,單詞
3、的屬性值)。表1-1單詞符號(hào)及其內(nèi)部表示單詞符號(hào)種別編碼單詞的屬性值beginifthenelseend標(biāo)識(shí)符整型常數(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ù)課程后,為加深對(duì)課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個(gè)實(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é)符號(hào)串(即單詞符號(hào)串,以一個(gè)“”結(jié)尾),如果輸入串是句子則輸出“yes”,否則輸出“no”和錯(cuò)誤信息。算符優(yōu)先分析過程與非終結(jié)符號(hào)無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用,本題目給出文法的目的是為了便于對(duì)語法分析結(jié)果進(jìn)行驗(yàn)證。(1)文法設(shè)算符優(yōu)先文法為: 說明:i為整型常數(shù)或者為標(biāo)識(shí)符表示整型變量;使用中用*表示。(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ù)課程后,為加深對(duì)課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實(shí)際問題能力而設(shè)置的實(shí)踐環(huán)節(jié)。通過這個(gè)實(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ù)把輸入符號(hào)移進(jìn)分析棧,使用優(yōu)先關(guān)系表
6、在分析棧頂尋找最左素短語,將其歸約為一個(gè)非終結(jié)符號(hào)而實(shí)現(xiàn)的。這個(gè)分析過程與非終結(jié)符號(hào)無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用(所以本題目無需給出文法)?;谒惴麅?yōu)先分析方法的語法制導(dǎo)翻譯是在算符優(yōu)先語法分析的基礎(chǔ)上進(jìn)行翻譯工作(即語義分析),每當(dāng)將一個(gè)最左素短語歸約為一個(gè)非終結(jié)符號(hào)時(shí),就調(diào)用對(duì)應(yīng)產(chǎn)生式的語義子程序,去完成相應(yīng)的語義翻譯工作,這步歸約使用的產(chǎn)生式對(duì)非終結(jié)符號(hào)不加區(qū)分(即將所有的非終結(jié)符號(hào)用一個(gè)通用的非終結(jié)符號(hào)表示)。語法制導(dǎo)翻譯程序的輸入是終結(jié)符號(hào)串(即單詞符號(hào)串,以一個(gè)“”結(jié)尾),如果輸入符號(hào)串是句子,則按照其語義進(jìn)行翻譯,輸出等價(jià)的四元式序列(作為練習(xí)應(yīng)顯示輸出)。
7、二、課程設(shè)計(jì)正文1 詞法分析器設(shè)計(jì)1.1 以文件流的方式對(duì)詞法進(jìn)行輸入句子。1.2 標(biāo)識(shí)符和常數(shù)的屬性值(1)標(biāo)識(shí)符和常數(shù)的屬性值為該單詞在名次表或常數(shù)表中登機(jī)項(xiàng)的相對(duì)地址;(2)當(dāng)識(shí)別出一個(gè)標(biāo)識(shí)符或常數(shù)時(shí),要查名字表或常數(shù)表,若表中有其登記項(xiàng),則把得到的登記項(xiàng)地址作為其屬性值;(3)若表中沒有其登記項(xiàng),則建立一個(gè)新登記項(xiàng),該登記項(xiàng)地址作為其屬性值,此處的地址為在表中的下標(biāo)。1.3 主要數(shù)據(jù)結(jié)構(gòu)(1)屬性類dog,內(nèi)含某一單詞的顯示字符串和類別,類別包括關(guān)鍵字、標(biāo)識(shí)符、常數(shù);(2)輸入緩沖區(qū)buffer100,類型為字符型;(3)關(guān)鍵字表letter,類型為dog;(4)標(biāo)識(shí)符表varible
8、,類型為dog,存儲(chǔ)在句子中出現(xiàn)過的標(biāo)識(shí)符;(5)常數(shù)表constant,類型為dog,存儲(chǔ)在句子中出現(xiàn)過的常數(shù);(6)設(shè)置全局變量b,v,c,l記錄輸入緩沖區(qū)、標(biāo)識(shí)符表、常數(shù)表、關(guān)鍵字表的當(dāng)前最后一個(gè)指針。1.4 詞法錯(cuò)誤處理:出錯(cuò)則顯示錯(cuò)誤所在字符位置。2 算符優(yōu)先分析程序設(shè)計(jì)2.1 以文件流的方式對(duì)詞法進(jìn)行輸入句子。2.2 主要數(shù)據(jù)結(jié)構(gòu)(1)優(yōu)先關(guān)系表xx,全局變量,事先設(shè)定;(2)分析棧類stack,內(nèi)含數(shù)組array存儲(chǔ)終結(jié)符號(hào)、“#”、非終結(jié)符n,和數(shù)組array的長(zhǎng)度size;(3)數(shù)組str,用于存放輸入字符串。2.3 算法主要使用兩個(gè)while嵌套循環(huán),外層為當(dāng)前字符a不為#
9、則繼續(xù),內(nèi)層循環(huán)當(dāng)前字符a與其后一個(gè)終結(jié)符的相對(duì)優(yōu)先關(guān)系為大于時(shí),則進(jìn)行規(guī)約,否則執(zhí)行移入操作;2.4 當(dāng)分析棧中進(jìn)入#,且分析棧中只剩三個(gè)字符時(shí),表示分析成功,否則失敗。2.5 出錯(cuò)則顯示錯(cuò)誤所在字符位置。3 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序的設(shè)計(jì)3.1 該實(shí)驗(yàn)算法是在第二個(gè)實(shí)驗(yàn)的基礎(chǔ)上,將規(guī)約后產(chǎn)生的n變?yōu)榕R時(shí)變量ei或中間變量ti,當(dāng)產(chǎn)生中間變量的四元式時(shí),則輸出該四元式。3.2 為實(shí)現(xiàn)算法,這里用到詞法分析的思想,將輸入字符串先通過詞法分析,轉(zhuǎn)化為各單詞的屬性值或地址值。此做法便于實(shí)現(xiàn)數(shù)組的輸出和查看。三、課程設(shè)計(jì)總結(jié)或結(jié)論1詞法分析器設(shè)計(jì)在做這個(gè)實(shí)驗(yàn)以前一直認(rèn)為編譯的詞法分析器
10、是計(jì)算機(jī)內(nèi)部某個(gè)硬件部分。由于該門課程結(jié)課較早,有些內(nèi)容需要重新翻書查找。通過這次實(shí)驗(yàn),我對(duì)之前學(xué)過的內(nèi)容有了更深的理解,了解了掃描器的組成結(jié)構(gòu)、不同種類單詞的識(shí)別方法,掌握了由單詞的語法規(guī)則觸發(fā)、畫出識(shí)別單詞的狀態(tài)轉(zhuǎn)換圖、然后再用程序?qū)崿F(xiàn)的掃描器設(shè)計(jì)方法。2算符優(yōu)先分析程序設(shè)計(jì)該程序的主要難點(diǎn)在于何時(shí)規(guī)約和何地規(guī)約,以及規(guī)約前后對(duì)幾個(gè)指針位置的處理。通過本次實(shí)驗(yàn)一定程度上提高了軟件開發(fā)能力,對(duì)編譯原理這一門課程也有了比較深刻的了解,掌握了算符優(yōu)先分析方法。最后,由于所學(xué)知識(shí)不夠全面,實(shí)驗(yàn)在很多方面還有待完善,在以后的學(xué)習(xí)過程中,會(huì)掌握更多知識(shí),力求做到更好。3基于算符優(yōu)先分析方法的語法制導(dǎo)翻
11、譯程序的設(shè)計(jì)關(guān)于語法制導(dǎo)的內(nèi)容之前未在課堂上有學(xué)過,首先鍛煉了我的自學(xué)能力,通過學(xué)習(xí)和實(shí)踐掌握了從一種語句的語法和語義出發(fā),構(gòu)造相應(yīng)的語義子程序,實(shí)現(xiàn)語法制導(dǎo)翻譯的方法。這個(gè)實(shí)驗(yàn)有著第二個(gè)實(shí)驗(yàn)的基礎(chǔ),保持算符優(yōu)先分析的整體思想,在此基礎(chǔ)上利用詞法分析器的思想設(shè)計(jì)了一段模數(shù)轉(zhuǎn)換程序,將字符串轉(zhuǎn)換為數(shù)字形式。通過自己思考摸索,不斷調(diào)試,最終使程序得以正常運(yùn)行。四、參考文獻(xiàn)1 陳火旺,劉春林. 程序設(shè)計(jì)語言編譯原理. 北京:國(guó)防工業(yè)出版社,第三版. 2008,92 宋雨,程曉榮,黃志強(qiáng). 計(jì)算機(jī)綜合實(shí)踐指導(dǎo). 北京:清華大學(xué)出版社,第一版. 2004,2附錄(設(shè)計(jì)流程圖、程序、運(yùn)行結(jié)果等)(一)流程
12、圖1 詞法分析器設(shè)計(jì)開始結(jié)束初始化讀入需要分析的句子還有單詞未分析?否是是字母?是否其他單詞分析程序是數(shù)字?否輸出單詞二元式關(guān)鍵字或標(biāo)識(shí)符分析程序讀一個(gè)字符是常數(shù)分析程序2 算符優(yōu)先分析程序設(shè)計(jì)開始結(jié)束初始化,顯示算符優(yōu)先矩陣打開需要讀入的文檔a的優(yōu)先關(guān)系大于arry中最后一個(gè)終結(jié)符?是是array為空?否是將array中優(yōu)先關(guān)系一樣的字符規(guī)約為n構(gòu)造字符串s ,存儲(chǔ)需要分析的句子從s 中讀取一個(gè)字符a將a壓入數(shù)組array3. 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序的設(shè)計(jì)開始結(jié)束初始化,顯示算符優(yōu)先矩陣打開需要讀入的文檔da的優(yōu)先關(guān)系大于arry中最后一個(gè)終結(jié)符?是是array為空?否是將a
13、rray中優(yōu)先關(guān)系一樣的字符規(guī)約為臨時(shí)變量或中間變量,如有產(chǎn)生四元式則輸出構(gòu)造字符串s ,存儲(chǔ)需要分析的句子從digital 中讀取一個(gè)字符da將da壓入數(shù)組array對(duì)s里的每個(gè)字符進(jìn)行模數(shù)轉(zhuǎn)換,存入digital(二)程序代碼1 詞法分析器設(shè)計(jì)#include<iostream>#include<stdlib.h>#include <ctype.h>#include<string.h>using namespace std;char strtoken20;/存當(dāng)前構(gòu)成字符串class dogchar info20;int race;publi
14、c:dog(char cc20,int rr)/構(gòu)造函數(shù)strcpy(info,cc);race=rr;int comp(char ss20)/比較strtoken是否為此類別,否返回0if(strcmp(info,ss)=0)return race;return 0;char buffer100;/輸入緩沖區(qū)int b;/buffer指針char ch;/當(dāng)前讀進(jìn)字符dog* varible20;/符號(hào)表dog* constant20;/常數(shù)表dog* letter20;/已有單詞表int v,c,l;/對(duì)應(yīng)尾指針的后一個(gè)int a2;void init0()b=0;v=0;c=0;l=0;
15、letterl+=new dog("begin",1);letterl+=new dog("if",2);letterl+=new dog("then",3);letterl+=new dog("else",4);letterl+=new dog("end",5);void init()ch=' 'a0=-1;a1=-1;strcpy(strtoken,"");void getchar()/取當(dāng)前字符ch=bufferb;b+;void getbc()/取字符
16、直到不為空格while(ch=' ')getchar();bool isletter()/判斷是否為字母if(ch>='a'&&ch<='z')return 1;else if(ch>='a'&&ch<='z')return 1;return 0;bool isdigit()/判斷是否為數(shù)字if(ch>='0'&&ch<='9')return 1;return 0;void concat()/把字符連
17、接到當(dāng)前短語后邊strcat(strtoken,&ch);void retract()/回退一個(gè)字符ch=' 'b-;int reserve()/*整型函數(shù)過程,對(duì)strtoken則可回送0值中的字符串查找保留字表,若它是一個(gè)保留字則返回它的編碼;否則返回非保留字信息,譬如若0不是保留字的編碼*/int i,x;for(i=0;i<l;i+)x=letteri->comp(strtoken);if(x>0)return x;return 0;int insertid()/整型函數(shù)過程,將strtoken中的標(biāo)識(shí)符插入符號(hào)表,返回符號(hào)表指針varible
18、v=new dog(strtoken,v+1);v+;int i=v;return i;int insertconst()/整型函數(shù)過程,將strtoken中的常數(shù)插入常數(shù)表,返回常數(shù)表指針constantc=new dog(strtoken,c+1);c+;return c;void proerror()cout<<endl<<"第"<<b<<"個(gè)字符""<<bufferb-1<<""出錯(cuò)"<<endl;/cout<<
19、"errorerror!"<<endl;void f()/詞法分析器int code, value;init();/int a2;/作為return(種別,屬性)getchar(); getbc();if(isletter()while (isletter()|isdigit()concat(); getchar();retract();code=reserve();if (code=0)value=insertid();a0=6;/該單詞為標(biāo)識(shí)符a1=value;return;/return a;elsea0=code;/該單詞為保留字a1=-1;return
20、;/return a;else if (isdigit()while(isdigit()concat();getchar();retract();value=insertconst();a0=7;/該單詞為常數(shù)a1=value;return;/return a;else if (ch='=')a0=8;a1=-1;return;/return a;else if (ch='+')a0=9;a1=-1;return;/return a;else if (ch='*')getchar();if (ch='*')a0=11;a1=-1;
21、return;/return a;retract();a0=10;a1=-1;return;/return a;else if (ch=',')a0=12;a1=-1;return;/return a;else if (ch='(')a0=13;a1=-1;return;/return a;else if (ch=')')a0=14;a1=-1;return;/return a;else proerror(); /*錯(cuò)誤處理*/a0=-1;a1=-1;return;/return a;void disp()char x;/if(a0=-1)/pr
22、oerror();if(a1=-1)x='-'cout<<"("<<a0<<","<<x<<")"elsecout<<"("<<a0<<","<<a1<<")"void main()init0();/strcpy(buffer,"begin if else abcde 1234");/char in100; /用于接收輸入
23、文件名/ char str100;/存句子file *fin; /用于指向輸入文件的指針cout<<"請(qǐng)輸入所需文件名(xxx.txt):"cin>>in;while(fin=fopen(in,"r")=null) /判斷輸入文件名是否正確cout<<endl<<"打開詞法分析輸入文件出錯(cuò)!"<<endl;cout<<"請(qǐng)重新輸入:"strcpy(in,"");cin>>in;int m=0;/記錄str句子串的
24、長(zhǎng)度char ch1='a'while (ch1!='#')/從文件中讀入一串字符ch1=getc(fin);bufferm+=ch1;/cin>>buffer;int lllong=m-1;/cout<<lllong<<endl;while(b<lllong)init();f();disp();cout<<endl;/return;2 算符優(yōu)先分析程序設(shè)計(jì)#include<string.h>#include<stdlib.h>#include <ctype.h>#incl
25、ude<iostream>using namespace std;const int maxsize=100; /為數(shù)組str、in分配的最大存儲(chǔ)空間const int length=100;/為數(shù)組array分配的最大存儲(chǔ)空間char xx88=' ','+','*','!','i','(',')','#', '+','>','<','<','<',&
26、#39;<','>','>', '*','>','>','<','<','<','>','>', '!','>','>','<','<','<','>','>', 'i','&g
27、t;','>','>',' ',' ','>','>', '(','<','<','<','<','<','=',' ', ')','>','>','>',' ',' ','>'
28、,'>', '#','<','<','<','<','<',' ','='class stackprivate:int size;/size為當(dāng)前數(shù)組array的大小char arraylength;/用于存儲(chǔ)讀入的字符public:stack()size=0;/數(shù)組array的初始長(zhǎng)度為0void push(char ch)if(size<length)/如果數(shù)組未滿,則壓入arraysize=ch;size
29、+;else/若數(shù)組已滿,則給出出錯(cuò)信息cout<<"overflow!"<<endl;int pop(char ch,int len)/彈出字符準(zhǔn)備規(guī)約if(size-len>=0)for(int i=0;i<len;i+)chi=arraysize-len+i;size-=len;return len;elsecout<<"參數(shù)錯(cuò)誤!"<<endl;return 0;char judge(int pos)/判斷大小是否合法if(pos>=0&&pos<size)r
30、eturn arraypos;return '0'void disp_all()/輸出當(dāng)前數(shù)組中的字符for(int i=0;i<size;i+)if(judge(i)='!')cout<<"*"elsecout<<judge(i);if(size>7)cout<<'t'<<'t'elsecout<<'t'<<'t'<<'t'int getsize()/返回當(dāng)前數(shù)組大小
31、return size;char guiyue(char ch)/規(guī)約為'n' return 'n'int isnumch(char ch)/判斷ch是不是數(shù)字或小寫字母return (ch>='0'&&ch<='9'|ch>='a'&&ch<='z');int getrank(char ch1,char ch2)/根據(jù)算符優(yōu)先分析矩陣設(shè)置讀入優(yōu)先次序 /0表示等于,1表示大于,-1表示小于,2表示沒有優(yōu)先關(guān)系int i,j;if(isnumc
32、h(ch1)ch1='i'if(isnumch(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 ')':i=6;break;case '#':i=7;break;switch(ch2)case '+':j=1;break;case '*
33、':j=2;break;case '!':j=3;break;case 'i':j=4;break;case '(':j=5;break;case ')':j=6;break;case '#':j=7;break;if(xxij='>')return 1;else if(xxij='<')return -1;else if(xxij='=')return 0;elsereturn 2;int isvt(char ch)/區(qū)別參加規(guī)約的資格if(ch
34、>='a'&&ch<='z')return 1;if(ch>='0'&&ch<='9')return 1;for(int i=0;i<8;i+)if(ch=xx0i)return 1;return 0;/*主函數(shù)*/void main()cout<<"=該文法的算符優(yōu)先矩陣如下="<<endl;int i;for(i=0;i<8;i+) /輸出算符優(yōu)先矩陣for(int j=0;j<8;j+)if(xxij=
35、9;!')cout<<"*"<<'t' elsecout<<xxij<<'t' cout<<endl;char inmaxsize; /用于接收輸入文件名 char strmaxsize;/存句子file *fin; /用于指向輸入文件的指針cout<<"請(qǐng)輸入所需文件名(xxx.txt):"cin>>in;while(fin=fopen(in,"r")=null) /判斷輸入文件名是否正確cout<<
36、;endl<<"打開詞法分析輸入文件出錯(cuò)!"<<endl;cout<<"請(qǐng)重新輸入:"strcpy(in,"");cin>>in;int m=0;/記錄str句子串的長(zhǎng)度char ch1='a'while (ch1!='#')/從文件中讀入一串字符ch1=getc(fin);strm+=ch1;strm='#'/將'#'賦給字符串尾stack s;/定義stack類的變量sint len;len=int(strlen(str
37、);/取出輸入字符串的長(zhǎng)度 s.push('#');/先把'#'壓入數(shù)組arrayint k=s.getsize()-1;/k為當(dāng)前數(shù)組array讀入已讀入字符的位置標(biāo)識(shí),int t=0;/t為輸入字符串?dāng)?shù)組str即將被讀的字符位置標(biāo)識(shí),int j;/j用于記錄當(dāng)前數(shù)組array中的最后一個(gè)非終結(jié)符的位置char a=str0;/a用于傳遞即將讀入的字符char ch10;/存規(guī)約串while(a!='#')/如果a不等于'#',則繼續(xù)讀入操作或規(guī)約操作a=strt;if(a='*')if(strt+1='
38、*')a='!'t+;if(isvt(s.judge(k) j=k;elsej=k-1;while(isvt(a)&&getrank(s.judge(j),a)=1)/判斷是否滿足規(guī)約的條件 > s.disp_all();/規(guī)約后輸出當(dāng)前數(shù)組array中的字符int h=j,low=j-1;/h記錄要規(guī)約的位置,low記錄規(guī)約后數(shù)組array中的最qian一個(gè)非終結(jié)符的位置if(!isvt(s.judge(low)low-;while(getrank(s.judge(low),s.judge(h)!=-1)/尋找最前一個(gè)非終結(jié)符的位置用low記錄h
39、=low;low-;if(!isvt(s.judge(low)low-;h=s.getsize();/array的長(zhǎng)度low+;/規(guī)約的起始位置int len=h-low; /len記錄要規(guī)約的長(zhǎng)度for(int p=0;p<10;p+)chp='0's.pop(ch,len);/彈出要規(guī)約的字符用字符串ch存儲(chǔ)char c=guiyue(ch);/將ch規(guī)約為ns.push(c);/再將規(guī)約后的n壓入數(shù)組中cout<<" 規(guī)約: "for(i=0;i<strlen(ch);i+)if(chi='!')cout<
40、<"*"elsecout<<chi;cout<<" -> "<<guiyue(ch)<<endl;j=s.getsize()-1;if(!isvt(s.judge(j)j-;/s.disp_all();if(!(a>='a'&&a<='z')&&getrank(s.judge(j),a)=2)/當(dāng)待輸入字符不是大寫字母且與前一個(gè) /非終結(jié)符無優(yōu)先關(guān)系則提示出錯(cuò)并給出提示cout<<"出錯(cuò)!"
41、;<<endl;cout<<"錯(cuò)誤為第 "<<t+1<<"個(gè)字符 :"<<strt<<endl;exit(0);elses.disp_all();if(a='!')cout<<"移進(jìn): *"<<endl;elsecout<<"移進(jìn): "<<a<<endl;s.push(a);/將a壓入數(shù)組array/讀入后輸出當(dāng)前數(shù)組array中的字符t+;k=s.getsize()-
42、1;s.disp_all();char temp10; s.pop(temp,3);if(s.getsize()=0)/如果最后數(shù)組array的長(zhǎng)度size的值為0,則分析成功cout<<"成功!"<<endl;else/否則,分析失敗cout<<"失敗!"<<endl;fclose(fin);/關(guān)閉輸入文件 3 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序的設(shè)計(jì)#include<string.h>#include<stdlib.h>#include <ctype.h>#inc
43、lude<iostream>using namespace std;typedef class four *c;char xx88=' ','+','*','!','i','(',')','#', '+','>','<','<','<','<','>','>', '*',&
44、#39;>','>','<','<','<','>','>', '!','>','>','<','<','<','>','>', 'i','>','>','>',' ','
45、39;,'>','>', '(','<','<','<','<','<','=',' ', ')','>','>','>',' ',' ','>','>', '#','<','<'
46、,'<','<','<',' ','='const int maxsize=100; /為數(shù)組str、in分配的最大存儲(chǔ)空間const int length=100;/為數(shù)組array分配的最大存儲(chǔ)空間int digitalmaxsize;int d_len=0;char b21;/標(biāo)識(shí)符,b0記錄最后一個(gè)的下標(biāo)int e21;/臨時(shí)變量,e0記錄最后一個(gè)的下標(biāo),1xx為標(biāo)識(shí)符地址,2xx為臨時(shí)變量地址c gama21;/一個(gè)中間變量即一個(gè)四元式,gamai記錄最后一個(gè)下標(biāo)int a=0,b=0,
47、c=0;/b,e,gama的最后一個(gè)下標(biāo) int atd(char ch);/將單個(gè)字符轉(zhuǎn)為為數(shù)字int entry(char ch);/查找ch是否在名字表內(nèi),返回名字表內(nèi)的下標(biāo)+100,如沒有則將其加入表中-okint newtemp(int t3);/新建一個(gè)臨時(shí)變量,返回其在臨變表中的下標(biāo)+200void fuzhi(int m,int n);/m.place:=n.placeint guiyue(int ch,int ll);/規(guī)約為'n'int getrank(int i,int j);/根據(jù)算符優(yōu)先分析矩陣設(shè)置讀入優(yōu)先次序int isword(char ch);/
48、判斷是否為字母/gai!void disp_one(int i);/輸出單個(gè)i代碼的字符,標(biāo)識(shí)符或符號(hào)void disp_deep_one(int i);/輸出單個(gè)i代碼的字符,標(biāo)識(shí)符或符號(hào)typedef class four/四元式char fuhao;/int s2,s3,s4;/(fuhao,s2,s3,s4)public:four(int f,int a1,int a2)/雙目運(yùn)算符,本題只有雙目運(yùn)算符.a1,a2均為地址位移量fuhao=xx0f;s2=a1;s3=a2;s4=c+300;void disp_four()cout<<"產(chǎn)生"<&l
49、t;c<<": ("if(fuhao='!')cout<<"*,"elsecout<<fuhao<<","disp_deep_one(s2);cout<<","disp_deep_one(s3);cout<<","disp_deep_one(s4);cout<<")"void disp_simple()cout<<"("if(fuhao='
50、;!')cout<<"*,"elsecout<<fuhao<<","disp_deep_one(s2);cout<<","disp_deep_one(s3);cout<<","disp_deep_one(s4);cout<<")"<<endl;*c;class stackprivate:int size;/size為當(dāng)前數(shù)組array的大小int arraylength;/用于存儲(chǔ)讀入的字符public:
51、stack()size=0;/數(shù)組array的初始長(zhǎng)度為0void push(int ch)/將ch壓入arrayif(size<length)/如果數(shù)組未滿,則壓入arraysize=ch;size+;else/若數(shù)組已滿,則給出出錯(cuò)信息cout<<"overflow! push error!"<<endl;int pop(int ch,int len)/彈出字符準(zhǔn)備規(guī)約,返回彈出的字符個(gè)數(shù)if(size-len>=0)for(int i=0;i<len;i+)chi=arraysize-len+i;size-=len;retur
52、n len;elsecout<<"參數(shù)錯(cuò)誤!pop error!"<<endl;exit(0);int getone(int pos)/判斷是否可以取數(shù),并返回arrayposif(pos>=0&&pos<size)return arraypos;return 0;void disp_all()/輸出當(dāng)前數(shù)組中的所有字符=改改改!for(int i=0;i<size;i+)disp_one(arrayi);if(size>7)cout<<'t'<<'t'e
53、lsecout<<'t'<<'t'<<'t'int getsize()/返回當(dāng)前數(shù)組大小return size;stack s;/定義stack類的變量sint entry(char ch)/查找ch是否在名字表內(nèi),返回名字表內(nèi)的下標(biāo)+100,如沒有則將其加入表中-okfor(int i=1;i<=b0;i+)if(bi=ch)return i+100;b+a=ch;return a+100;int newtemp(int t3)/新建一個(gè)中間變量,返回其在臨變表中的下標(biāo)+300c+;gamac=new
54、four(t1,t0,t2);gamac->disp_four();cout<<endl;return c+300;int guiyue(int ch,int ll)/規(guī)約為e/t,返回其地址值 s.pop(ch,ll);if(ll=1)e+b=ch0;cout<<"規(guī)約:"disp_one(ch0);cout<<"=>"disp_one(b+200);cout<<endl;return b+200;else if(ch0=5&&ch2=6)/(。)e+b=ch1;cout<
55、;<"規(guī)約:("disp_one(ch1);cout<<")=>"disp_one(b+200);cout<<endl;return b+200;else if(ch0>100&&ch2>100&&ch1<100)cout<<"規(guī)約:"disp_one(ch0);disp_one(ch1);disp_one(ch2);cout<<"=>"disp_one(c+301);cout<<'
56、;t'return newtemp(ch);elsecout<<"規(guī)約失?。uiyue error!"<<endl;exit(0);int getrank(int i,int j)/根據(jù)算符優(yōu)先分析矩陣設(shè)置讀入優(yōu)先次序 /0表示等于,1表示大于,-1表示小于,2表示沒有優(yōu)先關(guān)系if(i/100=1)i=4;if(j/100=1)j=4;if(xxij='>')return 1;else if(xxij='<')return -1;else if(xxij='=')return 0;elsereturn 2;int isword(char ch)/判斷是否為字母/gai!if(ch>='a'&&ch<='z')return 1;if(ch>='a'&&ch<='z')return 1;return 0;int atd(char ch)/將單個(gè)字符轉(zhuǎn)為為數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)上冊(cè)數(shù)學(xué)教案-3信息窗一(長(zhǎng)方體和正方體的認(rèn)識(shí))-青島版(五四學(xué)制)
- 2025年借調(diào)合同三方協(xié)議
- 《小數(shù)的大小比較》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年四年級(jí)下冊(cè)數(shù)學(xué)北師大版
- 2025年學(xué)習(xí)雷鋒精神62周年主題活動(dòng)實(shí)施方案 (4份)
- 2025年學(xué)習(xí)雷鋒精神六十二周年主題活動(dòng)方案 合計(jì)3份
- 蘇教版數(shù)學(xué)三年級(jí)上冊(cè)單元測(cè)試卷-第五單元-解決問題的策略含答案
- 2023年網(wǎng)絡(luò)及通信協(xié)議處理軟件資金需求報(bào)告
- 2025年呼和浩特職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫及答案一套
- 2025年河北旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及參考答案
- 2025年廣西城市職業(yè)大學(xué)單招職業(yè)傾向性測(cè)試題庫學(xué)生專用
- 課件-DeepSeek從入門到精通
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 藥品類體外診斷試劑專項(xiàng)培訓(xùn)課件
- 心電監(jiān)護(hù)儀的操作及注意事項(xiàng) 課件
- 自動(dòng)化生產(chǎn)線運(yùn)行與維護(hù)完整版課件(全)
- 雙鋼板組合剪力墻工法
- 《嵌入式技術(shù)》課程標(biāo)準(zhǔn)(STM32版)
- tplink-mr11u刷openwrt教程
- 結(jié)構(gòu)力學(xué)+李廉錕版-+第七章 力法
- 土地整理竣工測(cè)量技術(shù)報(bào)告
- 所羅門學(xué)習(xí)風(fēng)格量表4頁
評(píng)論
0/150
提交評(píng)論