В основном я делаю парсер выражений. Поскольку мне нужна как можно более высокая производительность, и, согласно документации, создание грамматики может быть довольно медленным, я хотел бы повторно использовать грамматику и связать таблицу символов непосредственно перед синтаксическим анализом. Поскольку клиент грамматики, вероятно, будет иметь таблицу символов, которая создается и поддерживается перед синтаксическим анализом, я бы в идеале хотел бы также избежать копирования реальной таблицы, что приводит меня к следующему коду (упрощенному) для перевода терминов:
qi::symbols< char, double >* m_Symbols;
qi::rule< Iterator, double(), ascii::space_type > m_Val;
m_Val = qi::int_[ _val = boost::phoenix::static_cast_< double >( boost::spirit::_1 ) ] | qi::double_ | m_Symbols;
Проблема здесь в m_Symbols. Я хотел бы, чтобы m_Val содержал m_Symbols в качестве ссылки, поскольку, когда мы связываем таблицу символов, я естественным образом модифицирую указатель, который, как я полагаю, может быть каким-то образом решен с помощью boost :: phoenix :: ref? Но большая проблема в том, что я не могу использовать указатель на парсеры при компоновке нового парсера. Используя разыменование в выражении разыменования m_Symbols сразу, что нежелательно, я хочу отложить разыменование для разбора времени.