我想要做的是创建一个函数,它将带有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 :(得分:2)
这是对你的问题的狂热刺激。我不打算对它进行详细编码,而且我没有专注于语言语义,完美的编译等。
使用新类型(ExpresionVar)包装变量。使用ExpressionBuilder注册每个变量,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);
}