在解析表達式的標準庫中沒有任何現成的,沒有。但是,自己滾動解析器/評估器是一個很好的練習。我不想破壞樂趣,但這裏有一些想法:
這個想法是首先將輸入字符串解析成某種表示表達式的數據結構(通常是某種樹結構),然後'用一些給定的變量綁定評估'該數據結構。
的數據結構可能是tagged union,是這樣的:
enum ValueType {
ConstantValue, VariableValue, Addition, Division
};
struct Value {
enum ValueType type;
/* The 'representation' of the value. */
union {
int constantValue;
const char *variableValue;
struct {
struct Value *summand1;
struct Value *summand2;
} additionValue;
struct {
struct Value *dividend;
struct Value *divisor;
} divisionValue;
} repr;
};
對於解析部分,我建議在「遞歸下降」解析器,理解和手工編寫該地區很容易讀了。目標是定義一個函數
Value *parse(const char *s);
它返回給定字符串的表示形式。
評估部分非常簡單,適用於遞歸。我們的目標是定義一個函數
int eval(const Value *v, ??? bindings);
...其中???
將是某種類型的適當用於保持變量綁定(例如,字符串到int
映射)。取決於給定值的「類型」,它會執行的算術操作,例如:
int eval(const Value *v, ??? bindings) {
switch (v->type) {
case ConstantValue:
return v->repr.constantValue;
case Addition:
return eval(v->repr.additionValue.summand1) + eval(v->repr.additionValue.summand2);
...
抱歉,但什麼是正是通過'parse_formula()'完成的,不能用_usual_方法完成? – 2015-02-11 09:17:06
@SouravGhosh他正在尋找一個函數庫來解析函數的值。 – Hristo 2015-02-11 09:17:49
Mr @Chris先生喜歡'double result =((data1 + data2)^ data3)/ data4'或者我錯過了什麼? – 2015-02-11 09:19:36