在评估后,我在 C++ 中得到一个字符串,例如“true && (false || true)”
需要评估这个字符串。在 PHP 中,我们使用 eval 函数来实现这一点。我们如何在 C++ 中实现这一点?
在评估后,我在 C++ 中得到一个字符串,例如“true && (false || true)”
需要评估这个字符串。在 PHP 中,我们使用 eval 函数来实现这一点。我们如何在 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(或其他一些工具,请参阅其他答案)为您生成它。
C/C++ 中没有用于代码评估的内置工具(由于我认为语言的编译性质),因此您需要手动创建解析器。
我想你的例子的复杂性在于平衡逻辑表达式的语法定义(和,或,也许不是)。您可以使用boost库来使用Spirit,它可以让您以声明的方式定义语法。
这里已经有一个已回答的问题:Parsing Boolean Expression in C++,看看 sehe 的正确答案,它使用了精神并为您提供了一段工作代码。
只需将字符串与您要用于布尔值的任何单词进行比较。
例如:
bool parseBoolean(const std::string &str) {
return str == "true" || str == "yes" || str == "on";
}