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