C++中的布尔表达式解析器

3
我需要一个简单的布尔表达式解析器,用于我正在开发的一个小型C++模板引擎,并且我正在寻找一些可以为我完成此任务的库。不幸的是,我没有真正找到任何易于集成的东西。我发现了基于Spirit的solution,它似乎是一个很好的起点,但它并没有我需要的所有功能。我知道Spirit迷你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

我在语法细节上有些灵活,是否有人知道一个能够做到这一点并且易于集成的开源库?或者我如何扩展一些基于Spirit的示例?

例如,在这个boolean expression example中,我不太明白如何在解析之前设置变量的值。但即使我理解了,它也不能完全支持我所需的所有内容。

任何帮助/指针都将不胜感激!我花了很多时间试图理解Spirit,但我想我还没有足够的理解力来完成除了非常简单的解析之外的任何事情。


2
你在这里有两个选择:重复造轮子或学习boost::spirit :) 第一个选项表示你需要编写自己的库或者使用比boost更简单的库... - zaufi
1
对于简单的表达式,您不需要像boost::spirit这样的高级机器。您也不必重新发明轮子。请参阅如何在https://dev59.com/v3E95IYBdhLWcg3wlu6z#2336769上构建自己的表达式解析器。 - Ira Baxter
1
如果您关心性能,Boost Spirit 可以生成相当快速的代码。代码也可能不会太冗长。但是使用 Spirit 的一个缺点是,对于复杂语法,编译解析器的时间会非常长。 - Artem Tokmakov
2
有很多可供选择的选项,如下所示: Many alternatives are available. - Jerry Coffin
1个回答

0

了解这方面最好的方法可能是阅读斯特劳斯特鲁普的《C++程序设计语言》第6章,其中详细讨论了桌面计算器的源代码(可在此处获取:http://www.stroustrup.com/3rd_code.html)。

它很基础(因为它是一个教学工具),但很容易修改以适应您的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接