

下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 #include #include #include #include using namespace std; enum types DELIMITER = 1, V ARIABLE, NUMBER; /定義枚舉類型把 DELIMITER 初試化為 1 后面的相應的是前面值 class parser char *exp_ptr; / 定義一個指向表達式的指針 char token80; / 存儲表達式中的字符變量 char tok_type; / 存儲具體是什么類型 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。;/;/類的構照函數 double eval_exp(char *exp); ; / 類構照函數的具體實現 parser:parser() exp
3、_ptr = NULL;/ 把 exp_ptr 的指針初始化為空 / 方法 eval_exp 的具體實現過程 double parser:eval_exp(char *exp) double result; exp_ptr = exp;/ 把傳遞過來的參數 exp 負給 exp_ptr get_token(); if(!*token) serror(2); / 輸出沒有任何表達式的錯誤信息 return 0.0; eval_exp2(result); if(*token) serror(0); / last token must be null return result; / 兩個變量字符是
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; / 兩個變量是乘或者除操作 或者是取余 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; /進行 A 運算 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; / 進行有括號的算法 void parser:eval_exp6(double &result)| | *token = -) if(*token = () get_token(); eval_exp2(result); if(*token != ) serror(1); get_token(); else atom(result); / 取得數值 voi
8、d parser:atom(double &result) switch(tok_type) case NUMBER: result = atof(token); get_token(); return; default: serror(0); / 輸出出錯信息 . void parser:serror(int error) static char *e= 語法錯誤 , 不對稱的括號 , 您沒有輸入任何的表達式! ; cout eerror endl; / 取得下一個 token 值 void parser:get_token() register char *temp; tok_ty
9、pe = 0; temp = token; *temp = 0; if(!*exp_ptr) return; / 如果到表達式末尾則返回 while(isspace(*exp_ptr) +exp_ptr; / if(strchr(+-*/%A=(), *exp_ptr) /用 strchr 函數在字符串+- -*/%*/%人人=()=()中查找 *exp_ptr 指 向的字符所在位置,判斷返回值 (非 0 為真就執行 )以便是否執行以下語句 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 判斷是否是分隔符, 當 *exp_ptr 指向的字符不為分隔符時把值負給 *temp tok_type = V ARIABLE;/ 把 tok_type 置為 VARIABLE else if(isdigit(*exp_ptr) / isdigit 判斷 *exp_ptr 指向的字符是否為數字 while(!isdelim(*exp_ptr) *temp+ = *exp_ptr+; tok_type = NUMBER; *temp = 0; / isdelim 函數的具體實現,如果參數是一個分割符則返回真 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; /創建一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游類自媒體賬號定制化運營及推廣補償協議
- 裝修安裝免責協議書
- 道路損壞補償協議書
- 車輛洗車承包協議書
- 貸款展期還款協議書
- 車禍出院賠償協議書
- 車輛協助解壓協議書
- 車輛損傷賠付協議書
- 餐飲物業轉讓協議書
- 人才引進安家費協議書
- 智能教育技術驅動的個性化學習路徑優化研究
- 基層治理現代化視角下“楓橋經驗”的實踐路徑與創新研究
- 通信光纜租用協議合同書
- 2024-2025部編版小學道德與法治一年級下冊期末考試卷及答案(三套)
- 醫療救助資金動態調整機制-洞察闡釋
- 籃球培訓報名合同協議
- 冠狀動脈介入診斷治療
- 高效催化劑的開發與應用-全面剖析
- (四調)武漢市2025屆高中畢業生四月調研考試 物理試卷(含答案)
- (2024)仁愛科普版七年級下冊英語全冊知識點總結 (2022新課標 完整版)
- 醫院普法知識培訓課件
評論
0/150
提交評論