編譯原理實(shí)驗(yàn)指導(dǎo)書_第1頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書_第2頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書_第3頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書_第4頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、中南林業(yè)科技大學(xué)實(shí)驗(yàn)報(bào)告課程名稱: 編譯原理專業(yè)班級(jí):2014級(jí)計(jì)算機(jī)科學(xué)與技術(shù)2班姓名:王晶學(xué)號(hào):201445922017年5月5日目錄實(shí)驗(yàn)一 詞法分析2實(shí)驗(yàn)二 LL(1)分析法11實(shí)驗(yàn)三 逆波蘭式的產(chǎn)生及計(jì)算17實(shí)驗(yàn)四 LR(1)分析法24實(shí)驗(yàn)一 詞法分析一、 實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。 二、 實(shí)驗(yàn)題目如源程序?yàn)镃語(yǔ)言。輸入如下一段:main()int a=-5,b=4,j;if(a>=b) j=a-b; else j=b-a;要求輸出如下

2、:(2,”main”) (5,”(”) (5,”)”)(5,”) (1,”int”) (2,”a”)(4,”=”) (3,”-5”) (5,”,”)(2,”b”) (4,”=”) (3,”4”)(5,”,”) (2,”j”) (5,”;”)(1,”if”) (5,”(”) (2,”a”)(4,”>=”) (2,”b”) (5,”)”)(2,”j”) (4,”=”) (2,”a”)(4,”-”) (2,”b”) (5,”;”)(1,”else”) (2,”j”) (4,”=”)(2,”b”) (4,”-”) (2,”a”)(5,”;”) (5,”)三、 實(shí)驗(yàn)理論依據(jù)(一)識(shí)別各種單詞符號(hào)1

3、、 程序語(yǔ)言的單詞符號(hào)一般分為五種:(1) 關(guān)鍵字(保留字/ 基本字)if 、while 、begin(2) 標(biāo)識(shí)符:常量名、變量名(3) 常數(shù):34 、56.78 、true 、a 、(4) 運(yùn)算符:+ 、- 、* 、/ 、 、and 、or 、.(5) 界限符:, ; ( ) /*2、 識(shí)別單詞:掌握單詞的構(gòu)成規(guī)則很重要 (1) 標(biāo)識(shí)符的識(shí)別:字母| 下劃線+( 字母/ 數(shù)字/ 下劃線)(2) 關(guān)鍵字的識(shí)別:與標(biāo)識(shí)符相同,最后查表 (3) 常數(shù)的識(shí)別 (4) 界符和算符的識(shí)別 3、 大多數(shù)程序設(shè)計(jì)語(yǔ)言的單詞符號(hào)都可以用轉(zhuǎn)換圖來(lái)識(shí)別,如圖1-1 圖1-14、 詞法分析器輸出的單詞符號(hào)常常表示

4、為二元式:(單詞種別,單詞符號(hào)的屬性值)(1) 單詞種別通常用整數(shù)編碼,如1 代表關(guān)鍵字,2 代表標(biāo)識(shí)符等 (2) 關(guān)鍵字可視其全體為一種,也可以一字一種。采用一字一種得分法實(shí)際處理起來(lái)較為方便。 (3) 標(biāo)識(shí)符一般統(tǒng)歸為一種 (4) 常數(shù)按類型(整、實(shí)、布爾等)分種 (5) 運(yùn)算符可采用一符一種的方法。 (6) 界符一般一符一種的分法。 (二)超前搜索方法1、 詞法分析時(shí),常常會(huì)用到超前搜索方法。如當(dāng)前待分析字符串為“a>+” ,當(dāng)前字符為“>” ,此時(shí),分析器倒底是將其分析為大于關(guān)系運(yùn)算符還是大于等于關(guān)系運(yùn)算符呢? 顯然,只有知道下一個(gè)字符是什么才能下結(jié)論。于是分析器讀入下一個(gè)

5、字符+ ,這時(shí)可知應(yīng)將> 解釋為大于運(yùn)算符。但此時(shí),超前讀了一個(gè)字符+ ,所以要回退一個(gè)字符,詞法分析器才能正常運(yùn)行。又比如:+ 分析為正號(hào)還是加法符號(hào) (三)預(yù)處理預(yù)處理工作包括對(duì)空白符、跳格符、回車符和換行符等編輯性字符的處理,及刪除注解等。由一個(gè)預(yù)處理子程序來(lái)完成。四、 詞法分析器的設(shè)計(jì)1、 設(shè)計(jì)方法:(1) 寫出該語(yǔ)言的詞法規(guī)則。 (2) 把詞法規(guī)則轉(zhuǎn)換為相應(yīng)的狀態(tài)轉(zhuǎn)換圖。 (3) 把各轉(zhuǎn)換圖的初態(tài)連在一起,構(gòu)成識(shí)別該語(yǔ)言的自動(dòng)機(jī) (4) 設(shè)計(jì)掃描器 2、 把掃描器作為語(yǔ)法分析的一個(gè)過(guò)程,當(dāng)語(yǔ)法分析需要一個(gè)單詞時(shí),就調(diào)用掃描器。 掃描器從初態(tài)出發(fā),當(dāng)識(shí)別一個(gè)單詞后便進(jìn)入終態(tài),送出

6、二元式 開(kāi)始讀標(biāo)識(shí)符是字母掠過(guò)空格和回車符查保留字表是否查到換成屬性字結(jié)束是數(shù)字是特殊符號(hào)error取數(shù)換成屬性字換成屬性字換成屬性字YNYYYNNN圖1-2 取單詞程序框圖五、 完整程序源代碼#include <stdio.h>#include <string.h>#include <float.h>#include <fstream> FILE *fp;char cbuffer;char *key10="if","else","for","while","

7、;do","return","break","continue","stdio.h","math.h"int atype,id=4;/char digittp20; /定義一個(gè)數(shù)字?jǐn)?shù)組 char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer);int search(char searchchar ,int wordtype);int main() if (fp

8、=fopen("D:編譯原理實(shí)驗(yàn)1.c","r")=NULL) /*只讀方式打開(kāi)一個(gè)文件if(p=fopen("H:Text.txt","r")=NULL)*/ printf("error"); else cbuffer = fgetc(fp); /*fgetc( )函數(shù):從磁盤文件讀取一個(gè)字符*/ while (cbuffer!=EOF) if(cbuffer=' '|cbuffer='n'|cbuffer='t') /*掠過(guò)空格和回車符和tab

9、*/ cbuffer=fgetc(fp); else if(isalpha(cbuffer) /判斷是字母 cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer)|cbuffer='.') /判斷為數(shù)字 ,或者浮點(diǎn)數(shù) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); /判斷其為其他類型 return 0;char alphaprocess(char buffer) int atype; /*保留字?jǐn)?shù)組中的位置*/ int i=-1; ch

10、ar alphatp20; while (isalpha(buffer)|(isdigit(buffer)|buffer='_'|buffer='.') /讀到的是字母數(shù)字下劃線 . alphatp+i=buffer; buffer=fgetc(fp); /*讀一個(gè)完整的單詞放入alphatp數(shù)組中*/ alphatpi+1='0' /單詞讀完置上結(jié)束符號(hào) atype=search(alphatp,1); /*對(duì)此單詞調(diào)用search函數(shù)判斷類型*/ if(atype!=0) /判斷函數(shù)返回值不是0,是保留字,輸出1 printf("(

11、%s , 1)n",alphatp,atype-1); id=1; /保留字 else printf("(%s ,2)n",alphatp); id=2; /返回值是0,標(biāo)識(shí)符,第二類 return(buffer);int search(char searchchar ,int wordtype) /*判斷單詞是保留字還是標(biāo)識(shí)符*/ int i=0; int p; switch (wordtype) case 1:for (i=0;i<=9;i+) if (strcmp(keyi,searchchar)=0) p=i+1; break; /*是保留字則p為非

12、0且不重復(fù)的整數(shù)*/ else p=0; /*不是保留字則用于返回的p=0*/return(p); char digitprocess(char buffer) /讀入數(shù)字 int i=-1;char digittp20; /定義一個(gè)數(shù)字?jǐn)?shù)組 while (isdigit(buffer)|buffer='.'|buffer='e') /讀入一個(gè)完整的數(shù)字放在isdigit數(shù)組中 digittp+i=buffer; buffer=fgetc(fp); digittpi+1='0' /數(shù)組結(jié)束 printf("(%s ,3)n",

13、digittp); /輸出數(shù)字為第三類 id=3;return(buffer); char otherprocess(char buffer) /判斷為其他字符的函數(shù) char ch20; /定義一個(gè)字符數(shù)組 char ch120; char ch220; int i=0; ch0=buffer; /除了以上兩類其他都讀入 ch1='0' if(ch0=','|ch0=''|ch0=''|ch0=''|ch0='('|ch0=')') /讀入 , ; ( )字符時(shí)直接輸出為第五類 p

14、rintf("(%s ,5)n",ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0='#') /#define,#include關(guān)鍵字,第一類 buffer=fgetc(fp); while (isalpha(buffer) /讀到的是字母 ch+i=buffer; buffer=fgetc(fp); chi+1='0' /單詞讀完置上結(jié)束符號(hào) printf("(%s , 1)n",ch); id=1; return(buffer); if(ch0='_'

15、;) /以下劃線開(kāi)頭的第二類標(biāo)識(shí)符 buffer=fgetc(fp); while (isalpha(buffer) /讀到的是字母 ch+i=buffer; buffer=fgetc(fp); chi+1='0' /單詞讀完置上結(jié)束符號(hào) printf("(%s , 2)n",ch); id=2; return(buffer); if(ch0='|'|ch0='&'|ch0='!') if(ch0='!') printf("(%s ,4)n",ch); buffer=

16、fgetc(fp); id=4; return(buffer);elsebuffer=fgetc(fp);ch1=buffer;if(ch0=ch1)printf("(%s ,4)n",ch); buffer=fgetc(fp); id=4; return(buffer);elsech1='0'printf("(%s ,5)n",ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0='*'|ch0='/') /讀入 * 、時(shí)輸出為第4類運(yùn)算符 printf(

17、"(%s ,4)n",ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0='='|ch0='!'|ch0='<'|ch0='>') /讀入為 = ! < > 時(shí),還要再判下一個(gè)讀入的字符 buffer=fgetc(fp); / 再讀入一個(gè)字符 if(buffer='=') /如果下一個(gè)字符為= ch1=buffer; /把讀到的字符加入數(shù)組ch ch2='0' printf("(%s ,4)n&

18、quot;,ch); /兩個(gè)字符一起作為第4類運(yùn)算符輸出 else printf("(%s ,4)n",ch); /后面不是=的話直接作為第4類運(yùn)算符輸出 id=4; return(buffer); buffer=fgetc(fp); /繼續(xù)讀下一個(gè)字符 id=4; return(buffer); /返回下一個(gè)字符 if(ch0='+'|ch0='-') buffer=fgetc(fp);ch1=buffer; ch2='0' if(ch0=ch1)/如果為 + - printf("(%s ,4)n",ch

19、); id=4; buffer=fgetc(fp); return(buffer); else if(id=4) /*在當(dāng)前符號(hào)以前是運(yùn)算符,則此時(shí)為正負(fù)號(hào)*/ if(isalpha(buffer)/如果-號(hào)后面是一位字符變量 ch1='0' printf("(%s ,4) /-在字母前此時(shí)為單目運(yùn)算符n",ch);id=4; else ch10=ch0; while (isdigit(buffer)|buffer='.'|buffer='e') /讀入一個(gè)完整的數(shù)字放在isdigit數(shù)組中 ch1+i=buffer; buf

20、fer=fgetc(fp); ch1i+1='0' /數(shù)組結(jié)束 printf("(%s ,3)n",ch1); /輸出數(shù)字為第三類 id=3; buffer=fgetc(fp); return(buffer); else /此時(shí)為加減號(hào),只用輸出一個(gè),可是上面多讀了一個(gè),需要回退 ch1='0' printf("(%s ,4)n",ch); /buffer=fgetc(fp);此時(shí) 不用再讀下一個(gè)字符了,直接返回當(dāng)前buffer id=4; return(buffer); 六實(shí)驗(yàn)結(jié)果輸入的源代碼如下:在原來(lái)實(shí)現(xiàn)的基本功能的

21、基礎(chǔ)上實(shí)現(xiàn)了輸出頭文件,以下劃線開(kāi)頭的標(biāo)識(shí)符,與,或,非邏輯運(yùn)算符,多位浮點(diǎn)數(shù),負(fù)多位浮點(diǎn)數(shù),科學(xué)計(jì)數(shù)法,負(fù)科學(xué)技術(shù)法,自增自減運(yùn)算符,在字母前面的正負(fù)號(hào)為單目運(yùn)算符,等功能,運(yùn)算結(jié)果如下所示 實(shí)驗(yàn)二 LL(1)分析法一、實(shí)驗(yàn)?zāi)康模焊鶕?jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)預(yù)測(cè)分析LL(1)分析法的理解。二、實(shí)驗(yàn)題目實(shí)驗(yàn)規(guī)定對(duì)下列文法,用LL(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)E:=TG(2)G:=+TG(3)G:=(4)T:=FS(5)S:=*FS(6)S:=(7)F:=(E)(8)F:=i若輸入串為i+i*i# ,則輸出為

22、:#Ei+i*i#GTi+i*i#GSFi+i*i#GSii+i*i#GS+i*i#G+i*i#GT+i*i# TFS2. +7 G+TG6 S5 i4 Fi3 ETG1 產(chǎn)生式 剩余串 分析棧 步驟LL(1)的分析表為:  i + * ( ) # 說(shuō) 明 E e   e  Select(ETG)=(,i G g  g1g1Select (G+TG)=+Select (G)=#,) T t   t  Select (TFS)=(,i S s1 s  s1

23、s1Select (S*FS)=*Select (S)=#,) + F f1   f  Select (F(E)=(Select (Fi)=i3、 算法流程圖四、完整程序代碼#include <stdio.h>#include <stdlib.h> #include <string.h> typedef struct type/*產(chǎn)生式類型定義 */ char origin;/*大寫字符 */char array5;/*產(chǎn)生式右邊字符 */int length;/*字符個(gè)數(shù)*/ type; void print();/

24、*輸出分析棧 */ void print1();/*輸出剩余串*/ /各變量定義: char ch,x; char A20;/*分析棧*/ char B20;/*剩余串*/ char v120='i','+','*','(',')','#'/*終結(jié)符 */ char v220='E','G','T','S','F'/*非終結(jié)符 */ int j=0,k=0,b=0,top=0,l;/*L為輸入串長(zhǎng)度 */ int m=0

25、,n=0; int flag,finish; type e,t,g,g1,s,s1,f,f1;/*結(jié)構(gòu)體變量*/ type cha; type C1010;/*預(yù)測(cè)分析表數(shù)組*/ int main()e.length=2;g.length=2;g1.length=1;t.length=2;s.length=3;s1.length=1;f.length=3;f1.length=1; /*把文法產(chǎn)生式賦值結(jié)構(gòu)體*/e.origin='E'/e結(jié)構(gòu)體變量的變量賦值 strcpy(e.array,"TG");/ E:=TGg.origin='G'/g

26、結(jié)構(gòu)體變量的變量賦值 strcpy(g.array,"+TG");/G:=+TGg1.origin='G'/g1結(jié)構(gòu)體變量的變量賦值 g1.array0=''/G:=t.origin='T'/t結(jié)構(gòu)體變量 的變量賦值 strcpy(t.array,"FS");/T:=FSs.origin='S'/s結(jié)構(gòu)體變量的變量賦值 strcpy(s.array,"*FS");/S:=*FS s1.origin='S'/s1結(jié)構(gòu)體變量的變量賦值 s1.array0=&#

27、39;'/S:=f.origin='F'/f結(jié)構(gòu)體變量的變量賦值 strcpy(f.array,"(E)");/F:=(E)f1.origin='F'/f1結(jié)構(gòu)體變量的變量賦值 f1.array0='i'/F:=ifor(m=0;m<=4;m+)/*初始化分析表,5行5列*/for(n=0;n<=5;n+)Cmn.origin='Null'/*全部賦為空*/ /*填充分析表*/ C00=e;C03=e; C11=g;C14=g1;C15=g1; C20=t;C23=t; C31=s1;C32

28、=s;C34=C35=s1; C40=f1;C43=f; do/*讀入分析串*/ scanf("%c",&ch); if (ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#') /輸入串一定要為i,+,*,(,),# printf("輸入串中有非法字符n"); exit(1);/非正常退出 Bj=

29、ch; /如果輸入合法就讀入數(shù)組 b j+; while(ch!='#');/如果當(dāng)前字符不是結(jié)束符# ,就一直讀入 l=j;/*分析串長(zhǎng)度*/ ch=B0;/*當(dāng)前分析字符*/ Atop='#' A+top='E'/*'#','E'進(jìn)棧*/ printf("步驟tt分析棧 tt剩余字符 tt所用產(chǎn)生式 n"); do x=Atop-;/*x為當(dāng)前棧頂字符*/輸出棧頂字符 printf("%d",k+); printf("tt"); for(j=0;j&l

30、t;=5;j+)/*判斷是否為終結(jié)符*/ if(x=v1j) /如果棧頂字符為任意一個(gè)終結(jié)符 flag=1; break; /設(shè)置標(biāo)志位為1 if(flag=1)/*如果是終結(jié)符*/ if(x='#')/如果棧頂只剩下#,說(shuō)明分析完畢該結(jié)束了 finish=1;/*結(jié)束標(biāo)記*/ printf("acc!n");/*接受*/ getchar();/返回字符串#分析棧 getchar();/返回字符串#字符串 exit(0);/正常退出 if(x=ch)/如果當(dāng)前棧頂字符 等于數(shù)組B中的終結(jié)符 ,說(shuō)明匹配 print(); /分析棧列中元素 print1();/

31、剩余串列中元素 printf("%c匹配n",ch);/產(chǎn)生式列元素 ch=B+b;/*下一個(gè)輸入字符*/ flag=0;/*恢復(fù)標(biāo)記*/ else/*出錯(cuò)處理*/ print();/如果不匹配,出錯(cuò) print1(); printf("%c出錯(cuò)n",ch);/*輸出出錯(cuò)終結(jié)符*/ exit(1); else/*非終結(jié)符處理*/ for(j=0;j<=4;j+)/循環(huán)判斷非終結(jié)符所在的行號(hào) if(x=v2j)/如果棧頂元素為非結(jié)符 m=j;/*行號(hào)*/ break; for(j=0;j<=5;j+)/循環(huán)判斷終結(jié)符所在的列號(hào) if(ch=v1

32、j)n=j;/*列號(hào)*/ break; cha=Cmn;/把分析填充表中相應(yīng)的行列值賦值給cha if(cha.origin!='N')/*判斷是否為空*/ print(); print1();printf("%c->",cha.origin);/*輸出產(chǎn)生式*/for(j=0;j<cha.length;j+) printf("%c",cha.arrayj);/輸出數(shù)組元素 printf("n"); for(j=(cha.length-1);j>=0;j-)/*產(chǎn)生式逆序入棧*/A+top=cha.a

33、rrayj; if(Atop='')/*為空則不進(jìn)棧*/ top-; while(x!='0');return 0;void print()/*輸出分析棧 */ int a;/*指針*/for(a=0;a<=top+1;a+)printf("%c",Aa);printf("tt"); void print1()/*輸出剩余串*/int j;for(j=0;j<b;j+)/*輸出對(duì)齊符*/printf(" ");for(j=b;j<=l;j+)printf("%c",

34、Bj);printf("ttt");五、實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)三 逆波蘭式的產(chǎn)生及計(jì)算一、實(shí)驗(yàn)?zāi)康膶⒂弥芯Y式表示的算術(shù)表達(dá)式轉(zhuǎn)換為用逆波蘭式表示的算術(shù)表達(dá)式,并計(jì)算用逆波蘭式來(lái)表示的算術(shù)表達(dá)式的值二、實(shí)驗(yàn)題目如輸入如下:21+(42-2)*15+6 )-18#輸出為:原來(lái)表達(dá)式: 21+(42-2)*15+6 )- 18# 后綴表達(dá)式:21&42&2&-15&*6&+18&- 計(jì)算結(jié)果:609三、算法流程圖圖3-1 生成逆波蘭式的程序流程圖讀入一個(gè)逆波蘭算術(shù)表達(dá)式Ch=當(dāng)前輸入符號(hào)程序結(jié)束YNCh是運(yùn)算符Ch=#NY將該字符入棧根據(jù)運(yùn)算

35、符的特點(diǎn)從棧頂部取出若干個(gè)運(yùn)算對(duì)象進(jìn)行該運(yùn)算,將運(yùn)算結(jié)果入棧圖3-2 計(jì)算逆波蘭式的程序流程圖4、 完整程序代碼#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>#define max 100char strmax; /用于存放原來(lái)的表達(dá)式int top; /棧頂指針char stackmax; /定義棧,用于計(jì)算逆波蘭式char exmax; /存放后綴表達(dá)式double _stackmax; /定義棧,用于計(jì)算逆波蘭式子int flagmax; /用于區(qū)

36、分+、-號(hào)的含義,0表示運(yùn)算符,1表示正負(fù)號(hào)/生成逆波蘭式void trans() memset(flag,0,sizeof(flag); /flag初始值設(shè)為0 char ch=str0;/ch是讀入數(shù)組的第一個(gè) int i=1,t=0;/t用來(lái)記錄目標(biāo)傳長(zhǎng)度 top=0; while(ch!='#')/如果不是結(jié)束符 switch(ch)/逐個(gè)判斷當(dāng)前輸入符號(hào) case '(':/如果當(dāng)前是左括號(hào) top+;/入棧 stacktop=ch; break; case ')':/如果當(dāng)前是右括號(hào) while(stacktop!='(

37、9;)/如果棧頂不是左括號(hào) ext=stacktop;/棧頂元素寫到目標(biāo)數(shù)組 top-;/如果棧頂元素剛好是左括號(hào),直接彈出站 t+; top-; break; case '': case '': while(stacktop=''|stacktop='') /設(shè)置,運(yùn)算符優(yōu)先級(jí)為最高 ext=stacktop;top-;t+;/如果是乘方運(yùn)算符,乘方運(yùn)算符出棧 top+;/如果不不是的話就入棧 stacktop=ch; break; case '+': case '-': /當(dāng)ch為+、-號(hào)是,若

38、前面相鄰字符不是')'或數(shù)字且后面相鄰字符是數(shù)字時(shí)表示正負(fù)號(hào) if(isdigit(stri) && !isdigit(stri-2) && stri-2!=')') flagt=1; /標(biāo)記符號(hào)為正負(fù)號(hào) ext+=ch;/正負(fù)號(hào)直接進(jìn)入目標(biāo)數(shù)組 ch=stri+;/讀取下一個(gè)數(shù) while(ch>='0'&&ch<='9')|ch='.') /判別小數(shù)點(diǎn) ext=ch;/如果當(dāng)前字符是數(shù)字或者小數(shù)點(diǎn),直接放到目標(biāo)數(shù)組 t+; ch=stri;/讀下一個(gè)字

39、符 i+; i-;/如果不是數(shù)字或者小數(shù)點(diǎn),再退回判斷 ext='&' t+; else while(top!=0&&stacktop!='(')/如果棧中已經(jīng)有元素了,并且棧頂不是左括號(hào) ext=stacktop;top-;t+;/棧頂運(yùn)算分量出棧,放到目標(biāo)數(shù)組里 top+;/如果棧頂為空或有左括號(hào)時(shí),+/-字符串入棧 stacktop=ch; break; case '*': case '/': while(stacktop='*'|stacktop='/'|stackt

40、op=''|stacktop='') /棧頂?shù)某顺亲筮叺某顺蛘叱朔?,?yōu)先級(jí)別高 ext=stacktop;top-; t+;/棧頂元素出棧,輸出左邊的乘除或乘方,優(yōu)先級(jí)別高 top+;/當(dāng)前的乘除號(hào)入棧 stacktop=ch; break; case ' ':/跳過(guò)空格 break; default: while(ch>='0'&&ch<='9')|ch='.') /如果是數(shù)字或者浮點(diǎn)數(shù) ext=ch;t+;/直接放到目標(biāo)數(shù)組 ch=stri;i+; i-;/如果

41、不是數(shù)字,退回一個(gè)繼續(xù)判斷原數(shù)組 ext='&'/目標(biāo)數(shù)組每個(gè)終結(jié)符之間相隔一個(gè)& t+; ch=stri; i+;/重新判斷下一個(gè)符號(hào) while(top!=0)/輸入串已經(jīng)判斷完畢,棧還不空 if(stacktop!='(')/如果棧頂元素不為左括號(hào) ext=stacktop;t+;top-;/棧頂依次出棧 到碰到左括號(hào)為止 else printf("error");top-;exit(0);/如果剩余,說(shuō)明(沒(méi)有匹配就報(bào)錯(cuò) ext='#' ext+1='0' printf("后綴

42、表達(dá)式:%sn",ex);/計(jì)算逆波蘭式void jisuan() char ch=ex0;/從目標(biāo)創(chuàng)重新取數(shù) int t=0; top=-1; while(ch!='#')/串沒(méi)有結(jié)束,就一直取串 if(ch='&')/如果當(dāng)前字符是分隔符,跳過(guò) ch=ex+t; continue; switch(ch) case '+': if(flagt) /'+'表示正號(hào) ch=ex+t; double d=0; while(ch>='0'&&ch<='9')/

43、循環(huán)取多位數(shù)字 d=10.0*d+double(ch-'0');/轉(zhuǎn)換成多位整數(shù) ch=ex+t; if(ch='.') /判斷是否為小數(shù) ch=ex+t; double k=1.0; while(ch>='0'&&ch<='9') d=d+double(ch-'0')/(10.0*k);/轉(zhuǎn)換成多位小數(shù) k=k+1.0; ch=ex+t; top+;/計(jì)算結(jié)果進(jìn)棧 _stacktop=d; else _stacktop-1=_stacktop-1+_stacktop;/不然直接取棧頂元素相加 to

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論