主要是為了更正之前的設計缺陷
1、算術表示式解析器的乙個缺陷在於它的語法是右結合的。這意味著8-2+1被解析為8-(2+1)
2、可以通過更正語法
expresion := expresion 』+』 term
但這會導致無限迴圈(expr呼叫expr,expr又呼叫expr…)
3、一種解決方法:
更改後的類圖:
在程式中的具體實現為:
node.h:
class multiplenode : public node
~multiplenode();
protected:
std::vectorchilds_;
std::vectorpositives_;
};class sumnode : public multiplenode
double calc() const;
};class productnode : public multiplenode
double calc() const;
};
node.cpp
multiplenode::~multiplenode()
}double sumnode::calc() const
assert(positiveit == positives_.end());
return result;
}double productnode::calc() const
//else if (token == token_minus)
// if (token == token_plus || token == token_minus)
multiplenode* multiplenode = new sumnode(node);
do while (token == token_plus || token == token_minus);
node = multiplenode;
} return node;
}node* parser::term()
//else if (token == token_divide)
// if (token == token_multiply || token == token_divide)
multiplenode* multiplenode = new productnode(node);
do while (token == token_multiply || token == token_divide);
node = multiplenode;
} return node;
}
體驗物件導向 計算器篇
剛開始看程杰大佬的 大話設計模式 感覺以前真的是空學了物件導向 拿著物件導向的利器 c 去做一些面向過程的東西 當然不是說面向過程不好 看到計算器篇之後馬上動手除錯 結果本來以為很簡單的東西讓我糾結了兩天 首先是思想 以前在書本上看過 物件導向的優點是 便於維護 便於更改 容易增加介面等等 從來沒有...
物件導向版計算器 八
讓表示式計算器支援變數賦值 新增幾個方法 主要用來確定賦值運算子 class node private noncopyable virtual void assign double virtual node 儲存變數class variablenode public node double calc...
物件導向編寫乙個計算器
首先分析計算器有加減乘除,取模,求餘等計算方式,所以我們在建立了這個類的同時就應該想到後期肯定需要進行這方面的擴充套件,所以在設計的時候就應該盡量不修改原有 的前提下進行功能的擴充套件,也就是降低物件之間的耦合度。廢話不多說,如下 namespace program public print dec...