編譯原理課程設(shè)計(jì)C語(yǔ)言編譯器的實(shí)現(xiàn)_第1頁(yè)
編譯原理課程設(shè)計(jì)C語(yǔ)言編譯器的實(shí)現(xiàn)_第2頁(yè)
編譯原理課程設(shè)計(jì)C語(yǔ)言編譯器的實(shí)現(xiàn)_第3頁(yè)
編譯原理課程設(shè)計(jì)C語(yǔ)言編譯器的實(shí)現(xiàn)_第4頁(yè)
編譯原理課程設(shè)計(jì)C語(yǔ)言編譯器的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上南華大學(xué)編譯原理課程設(shè)計(jì)名:編譯代生成器設(shè)計(jì) 專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué)生姓名 熊浩斌 班 級(jí) 計(jì)算機(jī)01班 學(xué) 號(hào) 指導(dǎo)老師 陳星 實(shí)驗(yàn)地點(diǎn) 8棟 2-209 完成日期:2013.6.2一、課程設(shè)計(jì)的目的 編譯原理課程兼有很強(qiáng)的理論性和實(shí)踐性,是計(jì)算機(jī)專業(yè)的一門非常重要的專業(yè)基礎(chǔ)課程,它在系統(tǒng)軟件中占有十分重要的地位,是計(jì)算機(jī)專業(yè)學(xué)生的一門主修課。為了讓學(xué)生能夠更好地掌握編譯原理的基本理論和編譯程序構(gòu)造的基本方法和技巧,融會(huì)貫通本課程所學(xué)專業(yè)理論知識(shí),提高他們的軟件設(shè)計(jì)能力,特設(shè)定該課程的課程設(shè)計(jì),通過設(shè)計(jì)一個(gè)簡(jiǎn)單的PASCAL語(yǔ)言(EL語(yǔ)言)的編譯程序,提高學(xué)生設(shè)

2、計(jì)程序的能力,加深對(duì)編譯理論知識(shí)的理解與應(yīng)用。二、課程設(shè)計(jì)的要求1、 明確課程設(shè)計(jì)任務(wù),復(fù)習(xí)編譯理論知識(shí),查閱復(fù)印相關(guān)的編譯資料。2、 按要求完成課程設(shè)計(jì)內(nèi)容,課程設(shè)計(jì)報(bào)告要求文字和圖表工整、思路清晰、算法正確。3、 寫出完整的算法框架。4、 編寫完整的編譯程序。 三、課程設(shè)計(jì)的內(nèi)容 課程設(shè)計(jì)是一項(xiàng)綜合性實(shí)踐環(huán)節(jié),是對(duì)平時(shí)實(shí)驗(yàn)的一個(gè)補(bǔ)充,課程設(shè)計(jì)內(nèi)容包括課程的主要理論知識(shí),但由于編譯的知識(shí)量較復(fù)雜而且綜合性較強(qiáng),因而對(duì)一個(gè)完整的編譯程序不適合平時(shí)實(shí)驗(yàn)。通過課程設(shè)計(jì)可以達(dá)到綜合設(shè)計(jì)編譯程序的目的。本課程的課程設(shè)計(jì)要求學(xué)生編寫一個(gè)完整的編譯程序,包括詞法分析器、語(yǔ)法分析器以及實(shí)現(xiàn)對(duì)簡(jiǎn)單程序設(shè)計(jì)語(yǔ)言

3、中的邏輯運(yùn)算表達(dá)式、算術(shù)運(yùn)算表達(dá)式、賦值語(yǔ)句、IF語(yǔ)句、While語(yǔ)句以及dowhile語(yǔ)句進(jìn)行編譯,并生成中間代碼和直接生匯編指令的代碼生成器。四、總體設(shè)計(jì)方案及詳細(xì)設(shè)計(jì)總體設(shè)計(jì)方案:1.總體模塊主程序詞法分析程序語(yǔ)法分析程序中間代碼生成程序2.表2.1 各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼 單詞符號(hào)種別碼bgin1:17If2:=18Then3<20wile4<>21do5<=22end6>23lettet(letter|digit)*10>=24dight dight*11=25+13;2614(27*15)28/16#0詳細(xì)設(shè)計(jì): 4.1界面導(dǎo)入設(shè)

4、計(jì) (1)一共三個(gè)選項(xiàng):choice 1-cifafenxi choice 2-yufafenxi choice 3-zhongjiandaima (2)界面演示 圖一 圖二 圖三 4.2詞法分析程序置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束結(jié)束否是(1)流程圖設(shè)計(jì)(2)具體功能的具體設(shè)計(jì)1、cifafenxi( ) 首先設(shè)置progn來(lái)接收輸入的語(yǔ)句,以#來(lái)結(jié)束; 調(diào)用掃描子程序 scaner1( ),每一次得到一個(gè)類型碼; 用switch判別相應(yīng)輸出; 直到syn1=0為止。2、掃描子程序scaner1( )-掃描輸入的語(yǔ)句 首先設(shè)置3個(gè)變量:token1用來(lái)存放構(gòu)成單詞符號(hào)的字符串;s

5、um1用來(lái)存放整型單詞;syn1用來(lái)存放單詞符號(hào)的類型碼。 有關(guān)scaner1()中關(guān)鍵點(diǎn)解析: while(ch=' ')|(ch='n') ch=progp+; ;忽略空格 if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch&g

6、t;='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; ;判別標(biāo)識(shí)符 for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; ;標(biāo)識(shí)符是否是關(guān)鍵字 if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0&

7、#39; ch=progp+; ;判別整數(shù) (3) 詞法分析的運(yùn)行結(jié)果 輸入begin x:=1; y:=1+2;end # 輸出4.3語(yǔ)法分析程序 (1) 具體功能的具體設(shè)計(jì) 1.yufafenxi()-分析程序 給出算術(shù)表達(dá)式文法,進(jìn)行適當(dāng)?shù)奈姆ㄗ儞Q輸入表達(dá)式;輸出表達(dá)式語(yǔ)法是否正確。 2.子程序的功能描述 (3) 語(yǔ)法分析的運(yùn)行結(jié)果 分析成功圖 分析失敗圖 4.4 中間代碼生成程序(1)總體描述采用遞歸下降(自上而下)的語(yǔ)法制導(dǎo)翻譯法。在前兩次試驗(yàn)的基礎(chǔ)上改進(jìn)。詞法分析程序 à 語(yǔ)法分析程序 à 語(yǔ)義分析程序 à編譯器。不斷完善,不斷改進(jìn)。漸變的過程。單詞符

8、號(hào)及種別表單詞符號(hào)種別編碼單詞值main1int 2float3double4char5if 6else 7do8while9l(l|d)*10內(nèi)部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20二進(jìn)制數(shù)值表示=21+22- 23* 24/ 25(26)272829,30;31>32>=33<34<=35=36!=37 (2)程序結(jié)構(gòu)描述 (3) 程序的功能描述從文件中讀入表達(dá)式,輸出其四元式的結(jié)果序列 是否為main?調(diào)用scanner是否為(?調(diào)用scanner是否為)?調(diào)用scanner調(diào)用語(yǔ)句塊分析函數(shù)staBlock出

9、錯(cuò)處理 遞歸下降示意圖 (4)詳細(xì)功能描述void scanner(); /掃描void lrparser(); void staBlock(int *nChain); /語(yǔ)句塊void staString(int *nChain); /語(yǔ)句串void sta(int *nChain); /語(yǔ)句void fuzhi(); /賦值語(yǔ)句void tiaojian(int *nChain); /條件語(yǔ)句void xunhuan(); /循環(huán)語(yǔ)句char* E(); /Expresiion表達(dá)式char* T(); /Term項(xiàng)char* F(); /Factor因子char *newTemp();

10、/自動(dòng)生成臨時(shí)變量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并p1和p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式void emit(char *res,char *num1,char *op,char *num2) 該函數(shù)的功能是生成一個(gè)三地址語(yǔ)句送到四式表中 char *newTemp()該函數(shù)的功能是會(huì)動(dòng)一個(gè)新的臨時(shí)變量,臨時(shí)變量名產(chǎn)生的 順序是T1,T2,T3,.int merge(int p1,int p2)該函數(shù)的功能是將以P1,

11、P2為鏈?zhǔn)椎膬蓷l鏈合并成一條鏈,返回時(shí)的函數(shù)值作為合并后的鏈?zhǔn)?。void backpatch(int p,int t)該函數(shù)的功能是把P所鏈接的每個(gè)四元式的第四區(qū)段(result段)都回 填t。void fuzhi()該函數(shù)的功能是對(duì)賦值語(yǔ)句進(jìn)行分析。void tiaojian(int *nChain)該函數(shù)的功能是對(duì)條件語(yǔ)句進(jìn)行分析。void xunhuan()該函數(shù)的功能是對(duì)循環(huán)語(yǔ)句進(jìn)行分析。(4) 結(jié)果演示 圖一 簡(jiǎn)單語(yǔ)句生成四元式 圖二 if語(yǔ)句的四元式生成 圖三 循環(huán)語(yǔ)句四元式生成(5)匯編生成if(strcmp(fourComi.opera,"=")=0) pr

12、intf("Move AX,%1sn",fourComi.arg1); printf("Move %5s,Axn",fourComi.result);if(strcmp(fourComi.opera,"+")=0) printf("Mov AX,%1sn",fourComi.arg1); printf("ADD Ax,%1sn",fourComi.arg2);printf("Mov %1s,Axn",fourComi.result);if(strcmp(fourComi.op

13、era,"-")=0) printf("Mov AX,%1sn",fourComi.arg1); printf("SUB Ax,%1sn",fourComi.arg2); printf("Mov %1s,Axn",fourComi.result);if(strcmp(fourComi.opera,"*")=0) printf("Mov AL,%1sn",fourComi.arg1); printf("MUL %1sn",fourComi.arg2); pr

14、intf("Mov %1s,Axn",fourComi.result);if(strcmp(fourComi.opera,"/")=0) printf("Mov AX,%1sn",fourComi.arg1); printf("DIv %1sn",fourComi.arg2); printf("Mov %1s,ALn",fourComi.result);if(strcmp(fourComi.opera,"goto")=0) printf("jmp L%1sn&quo

15、t;,i); 結(jié)果演示五、課程設(shè)計(jì)的體會(huì)與總結(jié) 經(jīng)過一個(gè)星期的編譯原理課程設(shè)計(jì),本人在陳宏建老師的指導(dǎo)下,順利完成該課程設(shè) 計(jì)。通過該課程設(shè)計(jì),收獲頗多。 詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。通過本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。 通過本次試驗(yàn),了解了語(yǔ)法分析的運(yùn)行過程,主程序大致流程為:“置初值”à調(diào)用scaner函數(shù)讀下一個(gè)單詞符號(hào)à調(diào)用IrParseà結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”à不是則“出錯(cuò)處理”,若

16、是則“調(diào)用scaner函數(shù)”à調(diào)用語(yǔ)句串分析函數(shù)à“判斷是否為end”à不是則“出錯(cuò)處理”,若是則調(diào)用scaner函數(shù)à“判斷syn=0&&kk=0是否成立”成立則說明分析成功打印出來(lái)。不成立則“出錯(cuò)處理”。 一、對(duì)實(shí)驗(yàn)原理有更深的理解通過該課程設(shè)計(jì),掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務(wù),熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程、構(gòu)造工具及其相關(guān)的技術(shù)對(duì)課本上的知識(shí)有了更深的理解,課本上的知識(shí)師機(jī)械的,表面的。通過把該算法的內(nèi)容,算法的執(zhí)行順序在計(jì)算機(jī)上實(shí)現(xiàn),把原來(lái)以為很深?yuàn)W的書本知識(shí)變的更為簡(jiǎn)單,對(duì)

17、實(shí)驗(yàn)原理有更深的理解。二、對(duì)該理論在實(shí)踐中的應(yīng)用有深刻的理解通過把該算法的內(nèi)容,算法的執(zhí)行順序在計(jì)算機(jī)上實(shí)現(xiàn),知道和理解了該理論在計(jì)算機(jī)中是怎樣執(zhí)行的,對(duì)該理論在實(shí)踐中的應(yīng)用有深刻的理解。三、激發(fā)了學(xué)習(xí)的積極性通過該課程設(shè)計(jì),全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實(shí)現(xiàn)方法。把死板的課本知識(shí)變得生動(dòng)有趣,激發(fā)了學(xué)習(xí)的積極性。把學(xué)過的計(jì)算機(jī)編譯原理的知識(shí)強(qiáng)化,能夠把課堂上學(xué)的知識(shí)通過自己設(shè)計(jì)的程序表示出來(lái),加深了對(duì)理論知識(shí)的理解。以前對(duì)與計(jì)算機(jī)操在這次課程設(shè)計(jì)中,我就是按照實(shí)驗(yàn)指導(dǎo)的思想來(lái)完成。加深了理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn),培養(yǎng)實(shí)踐動(dòng)手能力和程序開發(fā)能力的目的。 附錄-程序清單

18、#include<math.h>#include<stdlib.h>#include<fstream>#include<iostream>using namespace std;#define MAX 100char inputstream50; /存儲(chǔ)輸入句子int temp1=0; /數(shù)組下標(biāo)int right1; /判斷輸出信息int m2=0,sum2=0;/sum用于計(jì)算運(yùn)算符的個(gè)數(shù) /m用于標(biāo)記輸入表達(dá)式中字符的個(gè)數(shù) char JG='A'char strMAX;/用于存輸入表達(dá)式int tokene=0;/左括號(hào)的標(biāo)

19、志char prog180,token18,ch1;int syn1,p1,m1,n1,sum1;char *rwtab16="begin","if","then","while","do","end"int r1 ;char prog80; /存放所有輸入字符 char token8; /存放詞組 char ch; /單個(gè)字符 int syn,p,m,n,i; /syn:種別編碼 double sum; int count; int isSignal; /是否帶正負(fù)號(hào)(0不

20、帶,1負(fù)號(hào),2正號(hào))int isError;int isDecimal; /是否是小數(shù) double decimal; /小數(shù) int isExp; /是否是指數(shù) int index; /指數(shù)冪 int isNegative; /是否帶負(fù)號(hào) double temp; int temp2;int repeat; /是否連續(xù)出現(xiàn)+,-int nextq;int kk; /臨時(shí)變量的標(biāo)號(hào)int ntc,nfc,nnc,nnb,nna;char *rwtab9="main","int","float","double",&

21、quot;char","if","else","do","while" structchar result10; /字符串(字符數(shù)組)char arg110;char opera10;char arg210;fourCom20; /結(jié)構(gòu)體數(shù)組 cifafenxi();yufafenxi();zhongjiandaima();scaner1();void e();void e1();void t();void t1();void f();void lrparser(); void staBlock(int

22、*nChain); /語(yǔ)句塊void staString(int *nChain); /語(yǔ)句串void sta(int *nChain); /語(yǔ)句void fuzhi(); /賦值語(yǔ)句void tiaojian(int *nChain); /條件語(yǔ)句void xunhuan(); /循環(huán)語(yǔ)句char* E(); /Expresiion表達(dá)式char* T(); /Term項(xiàng)char* F(); /Factor因子char *newTemp(); /自動(dòng)生成臨時(shí)變量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并p1和p2

23、void emit(char *res,char *num1,char *op,char *num2); /生成四元式void scanner(); /掃描void lrparser()int nChain;nfc=ntc=1;nextq=1;if(syn=1) /mainscanner();if(syn=26) /(scanner();if(syn=27) /)scanner();staBlock(&nChain);elseprintf("缺少右括號(hào)n");else printf("缺少左括號(hào)n");elseprintf("缺少mai

24、nn");/<語(yǔ)句塊> := ''<語(yǔ)句串>''void staBlock(int *nChain) /語(yǔ)句塊if(syn=28) /scanner();staString(nChain);/backpatch(*nChain,nextq);if(syn=29) /scanner(); /讀下一個(gè)elseprintf("缺少號(hào)n");elseprintf("缺少號(hào)n");/<語(yǔ)句串>:=<語(yǔ)句><語(yǔ)句>void staString(int *nChain

25、) /語(yǔ)句串sta(nChain);backpatch(*nChain,nextq);while(syn=31) /;scanner();sta(nChain);/backpatch(*nChain,nextq-1);void sta(int *nChain) /語(yǔ)句if(syn=10)fuzhi();/*nChain=0;else if(syn=6) /iftiaojian(nChain);else if(syn=8) /doxunhuan();/<條件語(yǔ)句>->if(<條件>)<語(yǔ)句塊>void tiaojian(int *nChain)char

26、res10,num110,num210,op10;int nChainTemp;/<條件>-><表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式>if(syn=6) /ifscanner();/strcpy(num1,E();if(syn=26) /(scanner();strcpy(num1,E();if(syn<=37)&&(syn>=32) switch(syn)case 32:strcpy(op,">");break;case 33:strcpy(op,">=");bre

27、ak;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"=");break;case 37:strcpy(op,"!=");break;default:printf("error");scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);/nfc=nextq+1;ntc=nextq; /記住if語(yǔ)句位置emit(&

28、quot;0","if",num1,"goto"); nfc=nextq; /if中表達(dá)式為假emit("0","","","goto");/第一個(gè)0已回填backpatch(ntc,nextq); /ntc鏈接的所有四元式都回填nextqif(syn=27) /)scanner();staBlock(&nChainTemp); /語(yǔ)句塊*nChain=merge(nChainTemp,nfc);/<循環(huán)語(yǔ)句>:=do <語(yǔ)句塊>wh

29、ile <條件>void xunhuan()char res10,num110,num210,op10;int nChainTemp;if(syn=8) /donnc=nextq; /記住if語(yǔ)句位置,emit之后nextq就變了/emit("0","if",num1,"goto"); scanner();staBlock(&nChainTemp); /語(yǔ)句塊if(syn=9) /whilescanner();if(syn=26) /(scanner();strcpy(num1,E();if(syn<=37)

30、&&(syn>=32) switch(syn)case 32:strcpy(op,">");break;case 33:strcpy(op,">=");break;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"=");break;case 37:strcpy(op,"!=");break;default:printf(&q

31、uot;error");scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);nnb=nextq;emit("0","if",num1,"goto"); backpatch(nnb,nnc);nna=nextq;emit("0","","","goto");backpatch(nna,nextq);if(syn=27) /)scanner();void fuzhi() /賦值語(yǔ)句只

32、有1個(gè)操作數(shù)char res10,num10; /num操作數(shù)if(syn=10) /字符串strcpy(res,token); /結(jié)果scanner();if(syn=21) /=scanner();strcpy(num,E();emit(res,num,"=","");elseprintf("缺少=號(hào)n");char* E() /Expression表達(dá)式char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)mallo

33、c(10);num2=(char *)malloc(10);strcpy(num1,T();while(syn=22)|(syn=23) /+ -if(syn=22) /+strcpy(op,"+");elsestrcpy(op,"-");scanner();strcpy(num2,T();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* T() /Term項(xiàng)char *res,*num1,*op,*num2;res=(char *)malloc(

34、10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char *)malloc(10);strcpy(num1,F();while(syn=24)|(syn=25) /* /if(syn=24) strcpy(op,"*");elsestrcpy(op,"/");scanner();strcpy(num2,F();strcpy(res,newTemp();emit(res,num1,op,num2);strcpy(num1,res);return num1;char* F() /Factor因子

35、char *res;res=(char *)malloc(10);if(syn=10) /字符串strcpy(res,token);scanner();else if(syn=20) /二進(jìn)制數(shù)itoa(int)sum,res,10); /整數(shù)轉(zhuǎn)換為字符串scanner();else if(syn=26) /(scanner();res=E();if(syn=27) /)scanner();else isError=1;elseisError=1;return res;char *newTemp()char *p;char varTemp10;p=(char *)malloc(10);kk+;

36、itoa(kk,varTemp,10);strcpy(p+1,varTemp);p0='T'return p;/將p所鏈接的每個(gè)四元式的第四個(gè)分量都回填tvoid backpatch(int p,int t) int w,circle=p;while(circle) /circle不為0的時(shí)候w=atoi(fourComcircle.result); /四元式circle第四分量?jī)?nèi)容/strcpy(fourComcircle.result,t); /把t填進(jìn)四元式circle的第四分量sprintf(fourComcircle.result,"%d",t);

37、circle=w; /w記錄的是鏈條上下一個(gè)四元式,移動(dòng)!return;int merge(int p1,int p2) /合并p1和p2char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result) /四元式第四個(gè)分量不為0circle=atoi(fourComcircle.result); /strcpy(fourComcircle.result,p1);sprintf(fourComcircle.result,"%s",p1);/目的是用p1的值

38、覆蓋0return nResult; /p2是頭,p1覆蓋0,接在p2后邊void emit(char *res,char *num1,char *op,char *num2)strcpy(fourComnextq.result,res);strcpy(fourComnextq.arg1,num1);strcpy(fourComnextq.opera,op);strcpy(fourComnextq.arg2,num2);nextq+;void scanner() sum=0; decimal=0; m=0; for(n=0;n<8;n+) tokenn=NULL; ch=progp+;

39、/從prog中讀出一個(gè)字符到ch中 while(ch=' '|ch='n') /跳過空字符(無(wú)效輸入) ch=progp+; if(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z') /ch是字母字符 while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(

40、ch>='0')&&(ch<='9') tokenm+=ch; /ch=>token ch=progp+; /讀下一個(gè)字符 tokenm+='0' p-; /回退一格 syn=10; /標(biāo)識(shí)符 /如果是"begin","if","then","while","do","end"標(biāo)識(shí)符中的一個(gè) for(n=0;n<9;n+) if(strcmp(token,rwtabn)=0) syn=n+

41、1; break; else if(ch>='0')&&(ch<='9') IsNum: if(isSignal=1) /tokenm+='-' while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' /ch中數(shù)字本身是當(dāng)做字符存放的 ch=progp+; if(ch='.') isDecimal=1; ch=progp+; count=0; /之前忘了清零,123.123+123.123#兩個(gè)浮

42、點(diǎn)數(shù)就無(wú)法識(shí)別 while(ch>='0')&&(ch<='9') /pow(x,y)計(jì)算x的y次冪 temp=(ch-'0')*pow(0.1,+count); decimal=decimal+temp; /AddToDec(); ch=progp+; sum=sum+decimal; if(ch='e'|ch='E') isExp=1; ch=progp+; if(ch='-') isNegative=1; ch=progp+; while(ch>='0

43、')&&(ch<='9') /指數(shù) index=index*10+ch-'0' ch=progp+; /10的冪 /123e3代表123*10(3) /sum=sum*pow(10,index);是錯(cuò)誤的 if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); if(isSignal=1)sum=-sum;isSignal=0; p-; syn=20; else switch(ch) case '<': m=0; tokenm+=ch

44、; ch=progp+; if(ch='=') syn=35; tokenm+=ch; else syn=34; p-; break; case '>': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=33; tokenm+=ch; else syn=32; p-; break; case '=': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=36; tokenm+=ch; else syn=21; p-; break; case '+':temp2=progp;tokenm+=ch;if(temp2>='0')&&(temp2<='9')&&(repeat=1)isSignal=2;ch=progp+;repeat=0;goto IsNum;if(temp2='+')|(temp2='-')&&(repeat=0) /如果重復(fù)出現(xiàn)符號(hào),才將后邊的+,-視為正負(fù)號(hào)repeat=1;/ch=progp+;syn=22;break;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論