gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:25:29 25 4
gpt4 key购买 nike

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

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

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

在给定一组新的符号值的情况下,重新计算此(固定)等式值的最有效方法是什么?

最佳答案

Spirit 的标准使用方式并不像您想象的那么有限。

虽然您可以使用它来计算即时值,但更常见的是在输出属性中构建一个 AST 树,它可以被转换(简化、优化)和解释(例如发出虚拟机甚至汇编指令)。

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

  • calc1 in example/qi/compiler_tutorial/calc1.cpp

    Plain calculator example demonstrating the grammar. The parser is a syntax checker only and does not do any semantic evaluation.

  • calc2 in example/qi/compiler_tutorial/calc2.cpp

    A Calculator example demonstrating the grammar and semantic actions using plain functions. The parser prints code suitable for a stack based virtual machine.

  • calc3 in example/qi/compiler_tutorial/calc3.cpp

    A calculator example demonstrating the grammar and semantic actions using phoenix to do the actual expression evaluation. The parser is essentially an "interpreter" that evaluates expressions on the fly.

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

  • calc4 in example/qi/compiler_tutorial/calc4.cpp

    A Calculator example demonstrating generation of AST. The AST, once created, is traversed,

    1. To print its contents and
    2. To evaluate the result.

  • calc5 in example/qi/compiler_tutorial/calc5.cpp

    Same as Calc4, this time, we'll incorporate debugging support, plus error handling and reporting.

  • calc6 in example/qi/compiler_tutorial/calc6.cpp

    Yet another calculator example! This time, we will compile to a simple virtual machine. This is actually one of the very first Spirit example circa 2000. Now, it's ported to Spirit2.

  • calc7 in example/qi/compiler_tutorial/calc7/main.cpp

    Now we'll introduce variables and assignment. This time, we'll also be renaming some of the rules -- a strategy for a grander scheme to come ;-)

    This version also shows off grammar modularization. Here you will see how expressions and statements are built as modular grammars.

  • calc8 in example/qi/compiler_tutorial/calc8/main.cpp

    Now we'll introduce boolean expressions and control structures. Is it obvious now what we are up to? ;-)

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

关于c++ - 使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23912607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com