【问题标题】:Evaluating boolean expression in a string - Go评估字符串中的布尔表达式 - Go
【发布时间】:2016-07-28 19:29:02
【问题描述】:

我有一个字符串格式的布尔表达式,例如:

name := "Fred"

type := "Person"

我想将此表达式评估为真或假。

exp := "(name == Fred) && (type == Person)"

最终,我希望能够执行条件语句,例如:

if (exp) {
    ...
}

但是,根据研究,这并不是 Go 开箱即用的支持。我已经看到有关使用 AST 解析和评估的建议。但是,我还很陌生,尤其是 AST,因此不知道该怎么做。有人可以就我如何评估字符串布尔表达式提供任何指导吗?我还没有遇到任何完全支持这一点的软件包。

【问题讨论】:

  • o.õ 这很臭,你为什么需要字符串
  • 我有一个布尔表达式作为 JSON 存储在一个文件中。我解析 JSON 以创建我的字符串布尔表达式。一旦我有了表达式,我就需要对其进行评估。
  • 您的“布尔表达式”是否保证是正确的 Go 语法? (该示例不是有效的 Go,因此您不能直接将其解析为 Go)
  • 是的,让我们假设它是。我正在尝试了解执行此类操作所涉及的机制。
  • Evaluate formula in Go的可能重复

标签: string go boolean


【解决方案1】:

以下是正确的理论上。但是既然你在使用 Go,如果你可以使用 Go 语法,那么你可以使用 Go 的解析器和 AST。我没有看到任何可以在运行时评估 Go AST 的代码。但是你可能会写一个支持你想要的部分的。然后你就会有一个 Go 解释器。

为了支持任何随机表达式语法,您需要执行以下操作:

你会想要lex and parse。在内存中构建一个AST (Abstract Syntax Tree)。然后评估它。

你的树节点可能是(我的 Go 语法是错误的):

 Scope {Tree {
  Assignment { Symbol: "name", Symbol: "_literal_1" }
  Assignment { Symbol: "exp", Value: Tree: {
    AndOperation { Tree{...}, Tree{...} }
  }
}

等等

然后您的程序可以直接遍历您的 AST,或者您可以将其写入字节码形式,但这只有在您希望它更小且易于缓存以供以后使用时才真正有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多