【发布时间】:2013-09-16 08:07:45
【问题描述】:
经过评估后,我在 C++ 中得到了一个字符串 "真&&(假||真)"
需要评估这个字符串。 在 PHP 中,我们使用 eval 函数来实现这一点。 我们如何在 C++ 中实现这一点?
【问题讨论】:
-
不清楚你在问什么。你能发布你尝试使用的代码和你遇到的具体错误吗?
标签: c++
经过评估后,我在 C++ 中得到了一个字符串 "真&&(假||真)"
需要评估这个字符串。 在 PHP 中,我们使用 eval 函数来实现这一点。 我们如何在 C++ 中实现这一点?
【问题讨论】:
标签: c++
在 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(或其他一些工具,请参阅其他答案)为您生成它。
【讨论】:
只需将字符串与您要用于布尔值的任何单词进行比较。
例如:
bool parseBoolean(const std::string &str) {
return str == "true" || str == "yes" || str == "on";
}
【讨论】:
C/C++ 中没有用于代码评估的内置工具(由于我认为语言的编译性质),因此您需要手动创建解析器。
我认为您的示例的复杂性在于为平衡逻辑表达式(和、或、也许不是)定义语法。您可以使用 Spirit 和 boost libraries,它可以让您以声明的方式定义语法。
这里已经有一个已回答的问题:Parsing Boolean Expression in C++,看看 sehe 的正确答案,它使用了精神并为您提供了一段工作代码。
【讨论】: