因此,我成功地使用计算器示例将相对简单的语法的编译速度提高了约 50%(?)。计算器示例可以在这里找到。但是,示例中有一件事我并没有真正掌握,即calc6c.cpp:
#include "calc6c.hpp"
// This is not really called. Its only purpose is to
// instantiate the constructor of the grammar.
void instantiate_statement()
{
typedef std::string::const_iterator iterator_type;
std::vector<int> code;
statement<iterator_type> g(code);
}
我发现评论真的很混乱,特别是因为当我在我的代码中尝试它(使用我的语法)时,是否包含这样的函数并不重要。无论有没有这个编译单元,我都可以成功编译。在我看来,语法是在 ll 上实例化的。74 在calc6.cpp:
typedef std::string::const_iterator iterator_type;
typedef statement<iterator_type> statement;
vmachine mach; // Our virtual machine
std::vector<int> code; // Our VM code
statement calc(code); // Our grammar
那么为什么需要函数 *instantiate_statement* 呢?或者更确切地说:在编译最终程序时,拥有一个包含 *instantiate_statement* 函数的编译单元与没有这样的编译单元有什么区别?
另外,我看得很远,但似乎没有涵盖此示例的页面-或者,就此而言,将语法拆分为多个编译单元的更通用示例-更详细和示例在 Boost::Spirit 文档的最新版本中完全消失了。