0

在评估后,我在 C++ 中得到一个字符串,例如“true && (false || true)”

需要评估这个字符串。在 PHP 中,我们使用 eval 函数来实现这一点。我们如何在 C++ 中实现这一点?

4

3 回答 3

5

在 C++ 中没有eval内置函数。如果您需要此功能,您必须找到并使用外部库或自己实现它。

我不知道哪个是可以完成这项工作的最佳外部库。您可以使用 JavaScript 解释器 V8 或 Ruby 解释器,但它们太重了。

我会这样实现它。我会将输入字符串拆分为标记,即vector<string>: {"true", "&&", "(", "false", "||", "true", ")"}。然后我会遍历这个输入列表,并将元素推送到堆栈中。在每次推送之前,我会查看堆栈中的顶部几个元素,并进行评估,如下所示:

(empty stack, push)
"true"
"true", "&&",
"true", "&&", "(",
"true", "&&", "(", "false"
"true", "&&", "(", "false", "||",
"true", "&&", "(", "false", "||", "true"  (evaluate ||)
"true", "&&", "(", "true"
"true", "&&", "(", "true", ")"  (evaluate parens)
"true", "&&", "true"  (evaluate &&)
"true"

该技术是上下文无关文法的 LR(1) 解析的简化版本。

您可以自己实现解析器或使用flexbison(或其他一些工具,请参阅其他答案)为您生成它。

于 2013-09-16T08:12:59.097 回答
2

C/C++ 中没有用于代码评估的内置工具(由于我认为语言的编译性质),因此您需要手动创建解析器。

我想你的例子的复杂性在于平衡逻辑表达式的语法定义(和,或,也许不是)。您可以使用boost库来使用Spirit,它可以让您以声明的方式定义语法。

这里已经有一个已回答的问题:Parsing Boolean Expression in C++,看看 sehe 的正确答案,它使用了精神并为您提供了一段工作代码。

于 2013-09-16T08:21:08.517 回答
2

只需将字符串与您要用于布尔值的任何单词进行比较。

例如:

bool parseBoolean(const std::string &str) {
    return str == "true" || str == "yes" || str == "on";
}
于 2013-09-16T08:12:34.557 回答