【问题标题】:Evaluating string into boolean in C++ [closed]在 C++ 中将字符串评估为布尔值 [关闭]
【发布时间】:2013-09-16 08:07:45
【问题描述】:

经过评估后,我在 C++ 中得到了一个字符串 "真&&(假||真)"

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

【问题讨论】:

标签: c++


【解决方案1】:

在 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(或其他一些工具,请参阅其他答案)为您生成它。

【讨论】:

    【解决方案2】:

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

    例如:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-11
        • 1970-01-01
        • 2016-04-17
        • 2013-06-29
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        相关资源
        最近更新 更多