使用已知变量

时间:2015-11-21 07:38:08

标签: c++ string parsing logical-operators

我想要做的是创建一个函数,它将带有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。

1 个答案:

答案 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);
}