使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?

2024-03-17

我正在使用 Boost Spirit 来实现某些软件中的功能,该功能允许用户输入将重复应用于输入流的数学方程。输入流值使用符号表示boost::spirit::qi::symbols用户可以在他们的方程中引用。 (例如。out1 = 3 * in1 + in2)

解析和编译用户方程对性能不敏感,但计算其输出值是因为它构成时间关键管道的一部分。

在文档中使用 Spirit 的标准方式是在解析输入时计算输入的输出(属性)。然而,在每次计算之间只有符号的属性值(out1, in1等)会发生变化,感觉可能有一种更有效的方法来实现这一点,也许通过缓存表达式的抽象语法树并通过它进行迭代。

给定一组新的符号值,重新计算该(固定)方程的值的最有效方法是什么?


使用精神的标准方式并不像你想象的那么有限。

当你can用它来动态计算立即值,更常见的是build输出属性中的 AST 树,可以进行转换(简化、优化)和解释(例如发出虚拟机甚至汇编指令)。

编译器教程完整地展示了这一点,但计算器示例非常接近您似乎正在寻找的内容:http://www.boost.org/doc/libs/1_55_0/libs/spirit/example/qi/compiler_tutorial/ http://www.boost.org/doc/libs/1_55_0/libs/spirit/example/qi/compiler_tutorial/

  • calc1 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc1.cpp在示例/qi/compiler_tutorial/calc1.cpp中

    演示语法的简单计算器示例。解析器是一个语法 仅检查器,不进行任何语义评估。

  • calc2 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc2.cpp在示例/qi/compiler_tutorial/calc2.cpp中

    使用计算器示例演示语法和语义操作 简单的函数。解析器打印适合基于堆栈的虚拟的代码 机器。

  • calc3 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc3.cpp在示例/qi/compiler_tutorial/calc3.cpp中

    使用计算器示例演示语法和语义操作 phoenix来做实际的表情评估。解析器本质上是 即时评估表达式的“解释器”。

这就是您感兴趣的地方,因为它在解析期间停止进行计算:

  • calc4 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc4.cpp在示例/qi/compiler_tutorial/calc4.cpp中

    演示 AST 生成的计算器示例。 AST,一次 被创建、被遍历、

    1. 打印其内容并
    2. 来评估结果。

  • calc5 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc5.cpp在示例/qi/compiler_tutorial/calc5.cpp中

    与 Calc4 相同,这次我们将添加调试支持以及错误 处理和报告。

  • calc6 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc6.cpp在示例/qi/compiler_tutorial/calc6.cpp中

    另一个计算器示例!这次,我们将编译成一个简单的 虚拟机。这实际上是第一个 Spirit 示例之一 大约 2000 年。现在,它已移植到 Spirit2。

  • calc7 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc7/main.cpp在示例/qi/compiler_tutorial/calc7/main.cpp中

    现在我们将介绍变量和赋值。这次我们也将 重命名一些规则——这是未来更宏伟计划的策略;-)

    这个版本还展示了语法模块化。在这里您将看到如何 表达式和语句被构建为模块化语法。

  • calc8 http://www.boost.org/doc/libs/release/libs/spirit/example/qi/compiler_tutorial/calc8/main.cpp在示例/qi/compiler_tutorial/calc8/main.cpp中

    现在我们将介绍布尔表达式和控制结构。是吗 现在很明显我们在做什么? ;-)

我相信您会在本教程结束时找到很多灵感!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么? 的相关文章

随机推荐