Синтаксический анализатор последовательных ключей Boost Spirit - PullRequest
0 голосов
/ 22 марта 2019

Есть ли лучший способ сделать это с Духом? Я анализирую последовательную серию пар ключ-значение, с некоторыми окончаниями строк и другими точками между ними. Формат не настолько согласован, что я могу просто вытащить пары значений ключей с помощью одного правила. Итак, у меня есть адаптер и правила производства, такие как:

BOOST_FUSION_ADAPT_STRUCT(
  Record,
  ( std::string, messageHeader )
  ( double, field1 )
  ( std::string, field2 )
  ( Type3, field3 )
  // ...
  ( TypeN, fieldN )
)

template< typename Iterator, typename Skipper >
class MyGrammar : public qi::grammar< Iterator, Record(), Skipper >
{
public:
  MyGrammar() : MyGrammar::base_type{ record }
  {
    record =
      qi::string( "Message header" )
      >> field1 >> field2
      // ...
      >> fieldN;
    field1 = qi::lit( "field 1:" ) >> qi::double_;
    // ...
  }

  // field rule declarations...
};

Это простой, но утомительный способ сделать это, и я уже однажды превысил порог сложности правил компилятора, что вынудило меня реорганизовать поля в отдельные правила. Кроме того, если при синтаксическом анализе сообщения возникает ошибка, анализатор всегда показывает, что ошибка находится в начале строки, как правило, не дает ему достаточно контекста, чтобы выяснить, где на самом деле проблема. Я предполагаю, что это из-за того, как работает оператор >>.

Edit:

В ответ на вопрос Сихе я столкнулся с двумя проблемами с этим подходом и компилятором MSVC 15. Первой была ошибка компилятора на моем производстве верхнего уровня, когда он попадал где-то около 80 компонентов, разделенных >>:

recursive type or function dependency context too complex

Поэтому я вложил все, что мог, в подчиненные правила, чтобы уменьшить сложность. К сожалению теперь, после добавления еще большего количества правил, я сталкиваюсь с:

fatal error C1060: compiler is out of heap space

Итак, я считаю, что мне нужен какой-то способ для дальнейшей декомпозиции проблемы, а не просто длинная серия объединенных правил производства ...

...