所以我成功地使用计算器示例将相对简单的语法编译速度提高了大约50%(?)。 可以找到计算器示例here。但是,这个例子中有一件事我没有真正掌握,即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上实例化的。 calc6.cpp中的74:
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文档的最新版本中完全消失了。