(完整word版)編譯原理計(jì)算器C++實(shí)現(xiàn)(word文檔良心出品)_第1頁(yè)
(完整word版)編譯原理計(jì)算器C++實(shí)現(xiàn)(word文檔良心出品)_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、 #include #include #include #include using namespace std; enum types DELIMITER = 1, V ARIABLE, NUMBER; /定義枚舉類型把 DELIMITER 初試化為 1 后面的相應(yīng)的是前面值 class parser char *exp_ptr; / 定義一個(gè)指向表達(dá)式的指針 char token80; / 存儲(chǔ)表達(dá)式中的字符變量 char tok_type; / 存儲(chǔ)具體是什么類型 void eval_exp2(double &result); void eval_exp3(double &

2、;result); void eval_exp4(double &result); void eval_exp5(double &result); void eval_exp6(double &result); void atom(double &result); void get_token(); void serror(int error); int isdelim(char c); public: parser。;/;/類的構(gòu)照函數(shù) double eval_exp(char *exp); ; / 類構(gòu)照函數(shù)的具體實(shí)現(xiàn) parser:parser() exp

3、_ptr = NULL;/ 把 exp_ptr 的指針初始化為空 / 方法 eval_exp 的具體實(shí)現(xiàn)過(guò)程 double parser:eval_exp(char *exp) double result; exp_ptr = exp;/ 把傳遞過(guò)來(lái)的參數(shù) exp 負(fù)給 exp_ptr get_token(); if(!*token) serror(2); / 輸出沒(méi)有任何表達(dá)式的錯(cuò)誤信息 return 0.0; eval_exp2(result); if(*token) serror(0); / last token must be null return result; / 兩個(gè)變量字符是

4、加或者減操作 void parser:eval_exp2(double &result) register char op; double temp; +1 eval_exp3(result); while(op = *token) = + | | op = -) get_token(); eval_exp3(temp); switch(op) case -: result = result - temp; break; case +: result = result + temp; break; / 兩個(gè)變量是乘或者除操作 或者是取余 void parser:eval_exp3(do

5、uble &result) register char op; double temp; eval_exp4(result); while(op = *token) = * | | op = / | | op = %) get_token(); eval_exp4(temp); switch(op) case *: result = result * temp; break; case /: result = result / temp; break; case %: result = (int) result % (int) temp; break; /進(jìn)行 A 運(yùn)算 void pa

6、rser:eval_exp4(double &result) double temp, ex; register int t; eval_exp5(result); if(*toke n= A) get_token(); eval_exp4(temp); ex = result; if(temp=0.0) result = 1.0; return; for(t=(int)temp-1; t0; -t) result = result * (double)ex; void parser:eval_exp5(double &result) register char op; op

7、= 0; if(tok_type = DELIMITER) & *token=+ op = *token; get_token(); eval_exp6(result); if(op=-) result = -result; / 進(jìn)行有括號(hào)的算法 void parser:eval_exp6(double &result)| | *token = -) if(*token = () get_token(); eval_exp2(result); if(*token != ) serror(1); get_token(); else atom(result); / 取得數(shù)值 voi

8、d parser:atom(double &result) switch(tok_type) case NUMBER: result = atof(token); get_token(); return; default: serror(0); / 輸出出錯(cuò)信息 . void parser:serror(int error) static char *e= 語(yǔ)法錯(cuò)誤 , 不對(duì)稱的括號(hào) , 您沒(méi)有輸入任何的表達(dá)式! ; cout eerror endl; / 取得下一個(gè) token 值 void parser:get_token() register char *temp; tok_ty

9、pe = 0; temp = token; *temp = 0; if(!*exp_ptr) return; / 如果到表達(dá)式末尾則返回 while(isspace(*exp_ptr) +exp_ptr; / if(strchr(+-*/%A=(), *exp_ptr) /用 strchr 函數(shù)在字符串+- -*/%*/%人人=()=()中查找 *exp_ptr 指 向的字符所在位置,判斷返回值 (非 0 為真就執(zhí)行 )以便是否執(zhí)行以下語(yǔ)句 tok_type = DELIMITER;/ 把 tok_type 置為 DELIMITER / advance to next char *temp+

10、= *exp_ptr+; else if(isalpha(*exp_ptr) while(!isdelim(*exp_ptr) *temp+ = *exp_ptr+; /isdelim 判斷是否是分隔符, 當(dāng) *exp_ptr 指向的字符不為分隔符時(shí)把值負(fù)給 *temp tok_type = V ARIABLE;/ 把 tok_type 置為 VARIABLE else if(isdigit(*exp_ptr) / isdigit 判斷 *exp_ptr 指向的字符是否為數(shù)字 while(!isdelim(*exp_ptr) *temp+ = *exp_ptr+; tok_type = NUMBER; *temp = 0; / isdelim 函數(shù)的具體實(shí)現(xiàn),如果參數(shù)是一個(gè)分割符則返回真 int parser:isdelim(char c) if(strchr( +-/*%A=(), c) | | c=9 | | c=r | | c=0)/ 把+-/*%A=()09r 定義非分隔符 return 1; return 0; int main() char expstr80; parser ob; /創(chuàng)建一個(gè)

溫馨提示

  • 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)論