В основном я занимаюсь парсером выражений. Поскольку мне нужна как можно более высокая производительность, и, согласно документации, построение грамматики может быть довольно медленным, я хотел бы повторно использовать грамматику и связать таблицу символов непосредственно перед синтаксическим анализом. Поскольку у клиента грамматики, вероятно, будет таблица символов, которая создается и поддерживается перед синтаксическим анализом, в идеале я бы также хотел избежать копирования фактической таблицы, что приводит меня к следующему (упрощенному) коду для перевода терминов:
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 сразу, что нежелательно, я хочу отложить разыменование, чтобы разобрать время.