用已知变量解析字符串中的逻辑表达式

Posted

技术标签:

【中文标题】用已知变量解析字符串中的逻辑表达式【英文标题】:Parsing logic expressions in strings with known variables 【发布时间】:2015-11-21 07:38:08 【问题描述】:

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

然后该字符串将被逻辑测试。如果为真,则该函数将返回真,否则返回假。

我在想函数应该是这样的:

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

过去几个小时我一直在寻找实现此目的的方法,但我发现的只是算术数学方程解析器。到目前为止,我所做的只是将变量替换为三个输入值的部分。

如果有人愿意帮忙,你能告诉我怎么做吗?给我看例子肯定也很棒。

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

编辑:这应该包括 C++ 中的所有基本比较运算符,例如小于、大于、小于或等于、大于或等于、等于、不等于、和、或、括号。它将全部采用 C++ 格式。如果输入的格式不正确,函数会自动返回 false。

【问题讨论】:

我只需要插入变量并进行评估。在这里嵌入 Lua 绝对不是一个选择。 @CoreyIles 你的问题是什么?您是要求有人为您编写代码,还是您的代码存在特定问题? 阻止我使用它的不是 Lua 的大小。你建议我如何让它不那么宽泛? 【参考方案1】:

这是对您的问题的一次疯狂尝试。不详细写代码,也不关注语言语义、完美编译等。

用新类型 (ExpresionVar) 包装变量。使用 ExpressionBuilder 注册每个变量,其中包含在程序开头注册的逻辑运算符。参考结果中的cmets(伪代码)...

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);

【讨论】:

我认为这是一个非常好的答案——让语言处理运算符,并将重点转移到解析上。它可能只涉及到一点点处理括号、一元非等。但我认为考虑到操作的特定要求,这是一个很好的起点。

以上是关于用已知变量解析字符串中的逻辑表达式的主要内容,如果未能解决你的问题,请参考以下文章

C++逻辑表达式运算

寻求有关项目的建议。解析逻辑表达式

Multisim 之逻辑转换仪

补充知识:三元运算和逻辑运算

如何在 PHP 中解析一串布尔逻辑

c语言中逻辑或怎么用