【问题标题】:parser: parsing formulas in template files解析器:解析模板文件中的公式
【发布时间】:2009-02-27 15:51:44
【问题描述】:

我将首先描述问题,然后根据库来描述我目前正在研究的内容。

在我的应用程序中,我们有一组始终可用的变量。例如:TOTAL_ITEMS、PRICE、CONTRACTS、ETC(我们大约有 15 个)。应用程序的客户希望使用这些变量执行和显示某些计算。到目前为止,我一直在不断地将这些计算添加到应用程序中。这很麻烦,我想通过创建模板使其更通用,用户可以在模板中指定一组应用程序将解析和计算的公式。

这是一种情况:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS

所以,想做类似的事情让用户在模板文件中定义:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS 和一些元日期,比如显示它的屏幕。因此,他们将使用屏幕指定公式。该文件将包含许多这种性质的公式。

现在,我正在查看两个库:Spiritmatheval

有没有人推荐什么对这项任务更好,以及参考、示例、链接?

如果问题不清楚,请告诉我,我会尽力进一步澄清。

谢谢,

萨沙

【问题讨论】:

  • 看起来 matheval 是用 Euphoria 编写的……这对您的用例来说是个问题吗?
  • 这有什么问题?
  • 我想主要的问题是你需要 Euphoria ! :-)
  • 不只是一个 cpp 二进制文件吗?它适用于我们,适用于其他应用,在 AS3..
  • 我猜 Euphoria 可以编译为 C 并导出为 DLL 中的 C 函数,所以这可能就是您正在使用的。

标签: c++ parsing boost boost-spirit


【解决方案1】:

如果您有固定数量的变量,则调用解析器可能有点矫枉过正。虽然 Spirit 很酷,我一直想在项目中使用它。

我可能只是对字符串进行标记,制作以名称为键的变量映射(假设所有变量都是整数):

map<const char*,int*> vars;
vars["CONTRACTS"] = &contracts;
...

然后使用一个简单的后缀计算器函数进行实际数学运算。

编辑:

查看 MathEval,它似乎完全符合您的要求;设置变量并使用这些变量评估数学函数。我不确定您为什么要在语法解析器级别创建解决方案。您是否有任何 MathEval 不满足的要求?

【讨论】:

  • 好吧,这可能有点棘手,因为我必须使用许多不同的运算符 (- + * /)- 公式可以使用 30 个常量,有些可能会重复。
  • 这两个库都满足我的要求,据我所知......问题是使用另一个库的可扩展性和复杂性......
【解决方案2】:

看起来使用yaccbison 生成一个简单的解析器并将其集成到您的代码中应该不会太难。

【讨论】:

  • 那为什么不选择 Spirit 呢?减少对外部工具的依赖(我认为 Spirit 的外部性不如 yacc 和朋友)
  • 在精神与 yacc 的背景下,我当然会去提升。但是,我也看到 matheval 是轻量级的,并且更容易用于不太复杂的语法。谢谢
【解决方案3】:

我不了解 matheval,但 boost::spirit 可以非常有效地为您做到这一点:请参阅 there

如果您喜欢模板元编程,您可能想看看Boost::Proto,但开始使用它需要一些时间。

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多