讓表示式計算器支援變數賦值
新增幾個方法 主要用來確定賦值運算子
class node : private noncopyable
virtual void assign(double)
virtual ~node() {}
};
儲存變數
class variablenode : public node
double calc() const;
bool islvalue() const;
void assign(double val);
private:
const unsigned int id_;
storage& storage_;
};
double variablenode::calc() const
else
double calc() const;
};
double assignnode::calc() const
scanner掃瞄器的改變
#ifndef _scanner_h_
#define _scanner_h_
#include enum etoken
;class scanner
;#endif // _scanner_h_
void scanner::accept()
while (isalnum(ch) || ch == '_');
} else
token_ = token_error;
break;
}}
calc類的編寫(可以整合在parser中)
#ifndef _calc_h_
#define _calc_h_
#include "symboltable.h"
#include "storage.h"
#include class parser;
class calc
private:
storage& getstorage()
unsigned int addsymbol(const std::string& str);
unsigned int findsymbol(const std::string& str) const;
symboltable symtbl_;
storage storage_;
};#endif // _calc_h_
#include "calc.h"
unsigned int calc::findsymbol(const std::string& str) const
unsigned int calc::addsymbol(const std::string& str)
parser解析器
#ifndef _parser_h_
#define _parser_h_
class scanner;
class node;
class calc;
enum status
;class parser
;#endif // _parser_h_
node* parser::expr()
multiplenode* multiplenode = new sumnode(node);
do while (token == token_plus || token == token_minus);
node = multiplenode;
} else if (token == token_assign)
else
{ status_ = status_error;
std::cout<
物件導向計算器(五)
主要是為了更正之前的設計缺陷 1 算術表示式解析器的乙個缺陷在於它的語法是右結合的。這意味著8 2 1被解析為8 2 1 2 可以通過更正語法 expresion expresion term 但這會導致無限迴圈 expr呼叫expr,expr又呼叫expr 3 一種解決方法 更改後的類圖 在程式中...
體驗物件導向 計算器篇
剛開始看程杰大佬的 大話設計模式 感覺以前真的是空學了物件導向 拿著物件導向的利器 c 去做一些面向過程的東西 當然不是說面向過程不好 看到計算器篇之後馬上動手除錯 結果本來以為很簡單的東西讓我糾結了兩天 首先是思想 以前在書本上看過 物件導向的優點是 便於維護 便於更改 容易增加介面等等 從來沒有...
物件導向編寫乙個計算器
首先分析計算器有加減乘除,取模,求餘等計算方式,所以我們在建立了這個類的同時就應該想到後期肯定需要進行這方面的擴充套件,所以在設計的時候就應該盡量不修改原有 的前提下進行功能的擴充套件,也就是降低物件之間的耦合度。廢話不多說,如下 namespace program public print dec...