【问题标题】:Boolean expression parser in C++C++ 中的布尔表达式解析器
【发布时间】:2013-08-04 19:56:07
【问题描述】:

我需要一个简单的布尔表达式解析器,用于我正在开发的一个小型 C++ 模板引擎,并且我正在寻找一些可以为我做这件事的库。不幸的是,我并没有真正找到任何容易集成的东西。我发现了这种基于solution 的精神,这似乎是一个很好的起点,但它并不完全具备我需要的所有功能。我知道精神 mini-c 的例子,但它似乎太复杂了,我可能需要永远以某种方式剥离我需要的东西。基本上,我需要的是以下内容:

  • 具有变量类型的变量:整数、双精度、字符串、数组
  • 运算符“and”、“or”、“xor”、“not”以及正确/预期的优先级
  • 比较运算符 "=="、"!="、""、">="
  • “+”、“-”、“/”、“*”等算术运算符及其预期优先级
  • 可选:返回值的 C 风格函数调用,例如somefunc(12, "abc") 我可以在评估期间以某种方式映射到 c++ 函数

我需要能够为解析器提供所有变量及其值,包括数组。这个想法是能够评估表达式,例如:

var == 2 + 3
var != 2.32
var == "foo"
somearr[var][2] == "bar"
(var == 2) or (var > 100)

对于功能,我很高兴能够做这样的事情:

var.length() == 3
"bla".length() == 3

或者

length(var) == 3
length("bla") == 3

我在语法细节上有些灵活,所以有人知道可以做到这一点并且易于集成的开源库吗?或者我可以如何扩展一些基于精神的例子?

例如,在这个boolean expression example 中,我不太明白如何在解析变量之前将它们设置为某些值。但即使我这样做了,它也不能完全满足我的需要。

感谢任何帮助/指针!我花了相当长的时间试图理解精神,但我想我仍然没有很好地理解它,无法完成除了非常简单的解析之外的任何事情。

【问题讨论】:

  • 你有两个选择:reinvent the wheellearn boost::spirit :) 第一个选项你应该自己写图书馆或采取其他/比提升简单...
  • 对于简单的表达式,你不需要像 boost::spirit 这样的花哨的机器。您也不必重新发明轮子。在stackoverflow.com/a/2336769/120163 了解如何构建自己的表达式解析器
  • 如果您关心性能,Boost Spirit 将生成相当快的代码。代码也可能不会太冗长。 Spirit 的一个缺点是,在语法复杂的情况下,解析器的编译时间会非常高。

标签: c++ parsing boost expression


【解决方案1】:

了解这一点的最佳方法可能是阅读 Stroustrup 的“C++ 编程语言”的第 6 章,其中详细讨论了桌面计算器的源代码(可在此处获取:http://www.stroustrup.com/3rd_code.html)。

它是基本的(因为它是一种教学工具),但很容易修改以满足您的需求。

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多