2015-11-21 23 views
0

我想要做的是創建一個函數,該函數將帶有1-3個變量的輸入字符串(並且至少需要一個變量),然後解析該表達式的輸入。這個表達式將被認爲是合乎邏輯的,並返回true或false。解析已知變量的字符串中的邏輯表達式

例如,

"X == Y && 0.1 <= X < 1.0 && Z > 0.0" 

然後首先在該字符串中的變量將被通過迭代,並用實際值替換。在所有變量被替換之後,修改後的字符串將如下所示:

"1.0 == 1.0 && 0.1 <= 1.0 < 1.0 && 0.6 > 0.0" 

然後該字符串將被邏輯測試。如果這是真的,則該函數將返回true,否則返回false。

我在想該函數將是這樣的:

IsLogical(string, float X, float Y, float Z) 

我一直在尋找過去幾個小時的方式來做到這一點,所有的我已經找到了算術數學方程式解析器。到目前爲止,我所做的只是將變量替換爲三個輸入值的部分。

所以如果有人願意幫忙,你能告訴我怎麼做嗎?展示我的例子絕對會很棒。

此函數不能使用任何外部資源,如boost或嵌入式Lua。

編輯:這應該包括C++中的所有基本比較運算符,如小於,大於,小於或等於,大於或等於,等於,不等於和或括號。它將全部採用C++格式。如果輸入格式不正確,該函數會自動返回false。

+0

我只需要插入變量並進行評估。嵌入Lua絕對不是一種選擇。 –

+0

@CoreyIles你的問題實際上是什麼?你是問有人爲你寫代碼嗎,還是你的代碼有特定的問題? –

+0

這不是Lua的大小,它阻止了我使用它。你如何建議我把它縮小一點? –

回答

2

這是對你的問題的野蠻刺傷。我不打算詳細編碼它,並且我不關注語言語義,完美編譯等。

用新類型(ExpresionVar)包裝變量。用ExpressionBuilder註冊每個變量,其中包含在程序開始時註冊的邏輯運算符。請參考結果中的註釋(僞代碼)...

ExpressionVar 
{ 
    float value_; 
    std::string name_; 
}; 

LogicalOp 
{ 
    virtual std::string id() const = 0; 
    virtual bool operator()(
    const ExpressionVar& lhs, const ExpressionVar& rhs) const = 0; 
}; 

IsEqual : LogicalOp 
{ 
    std::string id() const override{ return "=="; } 
    bool operator()(
    const ExpressionVar& lhs, const ExpressionVar& rhs) const override 
    { 
    returns lhs.value_ == rhs.value_; 
    } 
}; 

//etc... 

ExpressionBuilder 
{ 
    void registerVar(std::initializer_list<const ExpressionVar&>); 
    static void registerLogical(LogicalOp&&); 

    bool result(const std::string& expression) const 
    { 
    //run through expression. 
    // Search for known ExpressionVariable (EV), if variable found, 
    // store as lhs, else throw. 
    // Then search for LogicalOp until found, if another EV found 
    // throw, else store op, whereafter searching of rhs, etc... 
    } 
}; 

bool IsLogical(
    const std::string& input, 
    std::initializer_list<ExpressionVar> variables) 
{ 
    //Logical ops registered prior... 
    return ExpressionBuilder().registerVar(variables).result(input); 
} 
+2

我認爲這是一個非常好的答案 - 讓語言與操作員打交道,並將重點轉移到解析。在那裏可能只涉及一點小小的處理括號,一元不等等 - 但我認爲這是考慮到操作的具體要求,一個很好的起點。 –