在C ++中将字符串评估为布尔值

时间:2013-09-16 08:07:45

标签: c++

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

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

3 个答案:

答案 0 :(得分: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)解析无上下文语法的简化版本。

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

答案 1 :(得分:2)

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

例如:

bool parseBoolean(const std::string &str) {
    return str == "true" || str == "yes" || str == "on";
}

答案 2 :(得分:2)

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

我认为你的例子的复杂性存在于平衡逻辑表达式(和,或者,或许不是)的语法定义中。您可以使用Spirit使用libraries,它允许您以声明方式定义语法。

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