Поэтому я успешно использовал пример калькулятора, чтобы ускорить компиляцию относительно простой грамматики примерно на 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.
Задача ещё не решена.
Других решений пока нет …