2015-02-11 56 views
2

例如,我有串((data1 + data2)^data3)/data4,我想我的小程序來獲得這個字符串,做這樣的事情:如何解析字符串中的公式?

int main(int argc, char **argv) { 

    double data1 = 1.0; 
    double data2 = 2.0; 
    double data3 = 3.0; 
    double data4 = 4.0; 

    double result = parse_formula("((data1 + data2)^data3)/data4"); 

    printf("Result is %d\n", result); 
    return 0; 
} 

是否有標準庫這樣的解析器?如果不是,我將如何自己製作這樣的解析器?

+0

抱歉,但什麼是正是通過'parse_formula()'完成的,不能用_usual_方法完成? – 2015-02-11 09:17:06

+0

@SouravGhosh他正在尋找一個函數庫來解析函數的值。 – Hristo 2015-02-11 09:17:49

+0

Mr @Chris先生喜歡'double result =((data1 + data2)^ data3)/ data4'或者我錯過了什麼? – 2015-02-11 09:19:36

回答

3

在解析表達式的標準庫中沒有任何現成的,沒有。但是,自己滾動解析器/評估器是一個很好的練習。我不想破壞樂趣,但這裏有一些想法:

這個想法是首先將輸入字符串解析成某種表示表達式的數據結構(通常是某種樹結構),然後'用一些給定的變量綁定評估'該數據結構。

的數據結構可能是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); 
    ... 
+0

我不認爲這是正確的答案。這個問題明確地問到是否有可用於解析和評估表達式的C庫。提問者並沒有問是否在標準庫中有東西,只是這樣一個庫是否存在於任何地方。答案顯然是肯定的。 是的,你可以通過實現你自己的解析器和評估器學到很多東西,但這不是提問者所要求的。 – rhody 2017-08-27 18:47:38

+0

@rhody請注意,OP還詢問「或者自己編碼的最佳方式是什麼?」。但是,如果您想分享可能有用的圖書館,請隨時添加答案。 – 2017-08-27 19:22:35

+0

我糾正了,你是對的。 – rhody 2017-09-25 00:19:35

2

標準庫中沒有這樣的功能,沒有。

有任何數量的庫,我不打算在這裏推薦一個。

請注意,沒有庫允許通過名稱對程序的變量進行「自動」訪問;它們在運行時不可用。您將不得不尋找具有可變支持的表達式求值器,並在嘗試評估公式本身之前初始化求值器中的變量。