Использование указателя на парсер в boost :: spirit - PullRequest
5 голосов
/ 09 марта 2011

В основном я делаю парсер выражений. Поскольку мне нужна как можно более высокая производительность, и, согласно документации, создание грамматики может быть довольно медленным, я хотел бы повторно использовать грамматику и связать таблицу символов непосредственно перед синтаксическим анализом. Поскольку клиент грамматики, вероятно, будет иметь таблицу символов, которая создается и поддерживается перед синтаксическим анализом, я бы в идеале хотел бы также избежать копирования реальной таблицы, что приводит меня к следующему коду (упрощенному) для перевода терминов:

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 сразу, что нежелательно, я хочу отложить разыменование для разбора времени.

1 Ответ

2 голосов
/ 10 марта 2011

я считаю простым

qi::symbols<char, double>* m_Symbols;
qi::rule<Iterator, double(), ascii::space_type> m_Val;

m_Val = qi::int_ | qi::double_ | qi::lazy(*m_Symbols);

должен делать то, что вам нужно. Анализатор lazy (см. здесь ) оценивает свой аргумент (повторно) только во время анализа.

...