Re[2]: Метапрограммисты надоели
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.10.14 12:55
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Т.е. вот допустим есть тривиальная задачка: прочитать большой текстовый файл в специфическом формате (например какая-нибудь вариация на тему csv). Какое вы предложите решение, чтобы оно было быстродействующим и при этом занимало пару строчек кода? )


Вариант ничего не использовать, взять да и написать ручками не рассматривается?
Re[23]: Метапрограммисты надоели
От: WolfHound  
Дата: 09.10.14 14:54
Оценка:
Здравствуйте, alex_public, Вы писали:

WH>>Ты уходишь от темы про нужность нетривиальных конструкторов.

_>Естественно они нужны. Но как это пересекается с темой автоматической генерации тривиальных конструкторов...
Вот так:
  [Record]
  public class ParsingFailureException : Exception
  {
    public ParseResult : ParseResult { get }
  }

    public class ParsingFailureException : Exception
    {
        [DebuggerBrowsable(DebuggerBrowsableState.Never), CompilerGenerated]
        private readonly ParseResult _N_ParseResult_7019;
        public ParseResult ParseResult
        {
            [CompilerGenerated]
            get
            {
                return this._N_ParseResult_7019;
            }
        }
        [RecordCtor]
        public ParsingFailureException([MappedMember("ParseResult")] ParseResult parseResult)
        {
            this._N_ParseResult_7019 = parseResult;
        }
        [RecordCtor]
        public ParsingFailureException(string message, [MappedMember("ParseResult")] ParseResult parseResult) : base(message)
        {
            this._N_ParseResult_7019 = parseResult;
        }
        [RecordCtor]
        public ParsingFailureException(string message, Exception innerException, [MappedMember("ParseResult")] ParseResult parseResult) : base(message, innerException)
        {
            this._N_ParseResult_7019 = parseResult;
        }
        [RecordCtor]
        public ParsingFailureException(SerializationInfo info, StreamingContext context, [MappedMember("ParseResult")] ParseResult parseResult) : base(info, context)
        {
            this._N_ParseResult_7019 = parseResult;
        }


_>Я вижу в основном мелкие придирки)

У вас там основной функциональности нет.

WH>>Мне про метапрограммирование на С++ рассказывать не нужно. Я про него всё знаю. По тому и могу легко задачки неберучки придумывать.

_>Вообще то судя по сегодняшнему обсуждению, про C++ ты на самом деле не совсем в курсе.
Или ты?

WH>>Ну, ты дай ссылку на "то". Чтобы я опять что-то "не то" не подумал.

_>Нуу даже не знаю на что кинуть тут ссылку.
Много букв. Потом посмотрю.

_>>>Я пока вообще не в курсе. Но мне показывали примеры с проверкой sql синтаксиса при компиляции (не в кривом варианте типа отображения на функции языка, как в linq или даже в C++ библиотеках, по нормальному) — это впечатляет.

WH>>Ссылку?
_>https://github.com/sfackler/rust-postgres-macros
Это как я понял плагин к компилятору.
Скорей всего клон вот этого:
https://github.com/rsdn/nemerle/wiki/SQL-macros
https://github.com/rsdn/nemerle/blob/master/macros/Data.n
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Метапрограммисты надоели
От: alex_public  
Дата: 09.10.14 17:59
Оценка: +1
Здравствуйте, Mystic, Вы писали:

_>>Т.е. вот допустим есть тривиальная задачка: прочитать большой текстовый файл в специфическом формате (например какая-нибудь вариация на тему csv). Какое вы предложите решение, чтобы оно было быстродействующим и при этом занимало пару строчек кода? )


M>Вариант ничего не использовать, взять да и написать ручками не рассматривается?


Нуу вообще говоря если надо искать нужную библиотеку, скачивать её, компилировать, подключать, смотреть документацию и т.п., то действительно иногда проще написать велосипед. Но Boost то чаще всего уже подключён к проекту, так что...
Re[4]: Метапрограммисты надоели
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.10.14 18:19
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Но Boost то чаще всего уже подключён к проекту, так что...


Я бьі не бьі так категоричен насчет "чаще всего". Кроме того, документацию по spirit тоже читать надо, покурить примерьі. Т. е. уже день потратить. Потом человек, которьій будет смотреть/поддерживать код, далеко не факт, что знаком со spirit. Плюс опять же, можно наткнуться на что-нить, типа ошибки компиляции на несколько страничек. И не разобраться сразу, в чем подвох.
Re[24]: Метапрограммисты надоели
От: alex_public  
Дата: 09.10.14 18:39
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Вот так:

WH>...

Аааа, т.е. подразумевается создание у наследника всех вариантов конструктора предка? Так это совсем другая задачка. И она действительно можно быть удобна в специфических случаях.

_>>Я вижу в основном мелкие придирки)

WH> У вас там основной функциональности нет.

Вариант Евгения я уже указал как подправить в точности под ваши требования, хотя на мой взгляд это всего лишь придирка (вообще не принципиально функция-член или отдельная шаблонная функция). Про вариант с record тоже всё работает в соответствие с примерами из описания. То, что при этом внутри реализуется чуть другая логика — это опять же придирка. )

_>>Вообще то судя по сегодняшнему обсуждению, про C++ ты на самом деле не совсем в курсе.

WH>Или ты?

Про std::atomic и move semantic ты похоже явно не в курсе. А хоть variadic template и полиморфные лямбды видел на практике? )

_>>https://github.com/sfackler/rust-postgres-macros

WH>Это как я понял плагин к компилятору.
WH>Скорей всего клон вот этого:
WH>https://github.com/rsdn/nemerle/wiki/SQL-macros
WH>https://github.com/rsdn/nemerle/blob/master/macros/Data.n

Ну так реализуется то через макросы, а не пересборкой компилятора. )
Re[25]: Метапрограммисты надоели
От: WolfHound  
Дата: 09.10.14 19:22
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Аааа, т.е. подразумевается создание у наследника всех вариантов конструктора предка? Так это совсем другая задачка. И она действительно можно быть удобна в специфических случаях.

Так я тебе именно это и говорил.

_>Вариант Евгения я уже указал как подправить в точности под ваши требования, хотя на мой взгляд это всего лишь придирка (вообще не принципиально функция-член или отдельная шаблонная функция). Про вариант с record тоже всё работает в соответствие с примерами из описания. То, что при этом внутри реализуется чуть другая логика — это опять же придирка. )

Конструкторы предка не создаёт.
С приватными членами класса не работает.
Фильтрации нет.
...

_>Про std::atomic и move semantic ты похоже явно не в курсе.

В курсе.

_>А хоть variadic template и полиморфные лямбды видел на практике? )

Я столько всего видел

_>Ну так реализуется то через макросы, а не пересборкой компилятора. )

В случае немерле это одно и то же. А в случае rust существенно разные механизмы.
Кстати я тут ещё раз на него глянул. До немерлового варианта ему как до пешком луны.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Метапрограммисты надоели
От: Mna 404 and heavy formation
Дата: 09.10.14 21:24
Оценка:
Здравствуйте, Cyberax, Вы писали:

S>>В Lisp красиво, без того уродства, коим являются шаблоны C++, любая, и самая сложная, грамматика, парсится в несколько десятков строк.

C>Ну так в LISP уродливо всё остальное.

Есть претензии к Common Lisp кроме скобок?
Re[4]: Метапрограммисты надоели
От: Cyberax Марс  
Дата: 09.10.14 23:16
Оценка:
Здравствуйте, Mna, Вы писали:

C>>Ну так в LISP уродливо всё остальное.

Mna>Есть претензии к Common Lisp кроме скобок?
Отсутствие типов, отсутствие нормального синтаксиса и т.п.
Sapienti sat!
Re[16]: Метапрограммисты надоели
От: jazzer Россия Skype: enerjazzer
Дата: 10.10.14 04:09
Оценка: 1 (1) +1
Здравствуйте, Хон Гиль Дон, Вы писали:

ХГД>Здравствуйте, jazzer, Вы писали:


ХГД>>>Ну да, косякнул, в низкоуровневом коде это бывает чаще.

J>>О чем и речь. Вместо простецкого полуоднострочного спирит-парсера (который еще короче записывается вообще регэкспом), есть полотенце низкоуровневого кода, в котором мало что понятно, зато легко напортачить и потом разгребать коредампы.

ХГД>Когда там спирита набегает не одна строка, а хотя бы десять, 200 строк низкоуровнего кода уже не выглядят столь ужасными. Лично для меня, естественно.

Вот честно, никогда не имел проблем со спиритом, хотя он у нас используется для парсинга разнообразнейших конфигов только в путь.
парсеры бывают и поболе, чем 10 строк.
Я вот, честно, не вижу ни единого аргумента за то, чтоб писать низкоуровневый код.

ХГД>>>Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки.

J>>Ну это разве что если сравнивать с поиском многопоточных ошибок.
J>>Потому что ошибки парсинга и обработки краевых случаев искать замучаешься.

ХГД>Это при применении спирита их искать замучаешься А уж если надо вычислять позицию, на которой случился синтакс еррор — вообще вешайся. А с низкоуровневым кодом пофиг, все прекрасно отлаживается, если чего-то не хватает — дописать можно без многочасовых копаний в доках или чужих исходниках.


На этот счет у меня есть специальный одноклеточный "парсер" throw_p, который прекращает парсинг и бросает исключение со всем необходимым (строка, колонка, объяснение).
Типа:
double_p | uint_p | int_p | throw_p("number expected")

И синтаксические ошибки сразу перестают быть проблемой.

Ну и про насчет дописывания — ничего удобнее спирита я пока не видел. Ну разве что perl

J>>А ведь ты там еще что-то про 30 вложенных парсеров писал...


ХГД>Дебаг итераторам это без разницы


в смысле, что они позволят отследить вылет за границы? Но и только ведь...

Ну недаром же генераторы парсеров придумали, ой, недаром

J>>А насчет многопоточности — не проще компилятору -DBOOST_SPIRIT_THREADSAFE скормить, раз уж у вас многопоточный парсинг, и забыть о проблеме раз и навсегда?


ХГД>Можно, конечно. Но кто вообще знал, что spirit через property_tree затянуло


Ну, батенька, это тогда уже не проблемы спирита, а проблемы property_tree. Это в их обязанности входит уведомить пользователя о подводных граблях в многопоточном окружении. И, по-хорошему, им бы надо иметь свой собственный дефайн на этот счет, раз есть зависимость от многопоточности.

J>>Не говоря уж о том, что это болезнь древнего спирита 1.х, в спирите-2 ее нет уже лет пять как:

J>>http://boost-spirit.com/home/2010/11/07/multi-threaded-qi-6-hours-37-seconds/

ХГД>Ну так зачем было примеры на классике постить

Это не ко мне вопрос
Я отвечал на то, что запостили.

ХГД>Ки, конечно, значительно лучше, но и там привязка семантических действий вся такая же неудобная и по-прежнему чертова уйма уровней вложенности.

Ци же? Или ты на японский манер этот иероглиф читаешь?

семантические действия в том виде, в каком они былы в первом спирите, во втором не нужны — там парсеры атрибутированы и все можно достать из атрибутов (или дать контейнер/структуру, в который она сама сложит результаты парсинга). Смотри здесь — как раз про то, как внезапно исчезают семантические действия, если заюзать атрибуты.
Вот тут мы парсим список чисел через запятую, и наполняем вектор v через семантическое действие с push_back, в стиле 1-го спирита:
phrase_parse( first, last
            , double_[push_back(phoenix::ref(v), _1)] % ','
            , space);

А вот как надо парсить во втором спирите:
phrase_parse( first, last
            , double_ % ','
            , space, v); // v здесь, в парсере о нем ни слова
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[17]: Метапрограммисты надоели
От: Хон Гиль Дон Россия  
Дата: 10.10.14 08:06
Оценка:
Здравствуйте, jazzer, Вы писали:

ХГД>>Когда там спирита набегает не одна строка, а хотя бы десять, 200 строк низкоуровнего кода уже не выглядят столь ужасными. Лично для меня, естественно.

J>Вот честно, никогда не имел проблем со спиритом, хотя он у нас используется для парсинга разнообразнейших конфигов только в путь.
J>парсеры бывают и поболе, чем 10 строк.
J>Я вот, честно, не вижу ни единого аргумента за то, чтоб писать низкоуровневый код.

Очевидно же — высокий порог вхождения. Мне вот парсеры писать нужно бывает редко, грубо говоря раз в год. Поэтому детали я где-то не знаю, где-то не помню. И в целом сложилось впечатление, что я код без спирита быстрее бы писал. Благо и так, и так пробовал.


ХГД>>Это при применении спирита их искать замучаешься А уж если надо вычислять позицию, на которой случился синтакс еррор — вообще вешайся. А с низкоуровневым кодом пофиг, все прекрасно отлаживается, если чего-то не хватает — дописать можно без многочасовых копаний в доках или чужих исходниках.


J>На этот счет у меня есть специальный одноклеточный "парсер" throw_p, который прекращает парсинг и бросает исключение со всем необходимым (строка, колонка, объяснение).

J>Типа:
double_p | uint_p | int_p | throw_p("number expected")

J>И синтаксические ошибки сразу перестают быть проблемой.

А позицию откуда брать?


J>Ну, батенька, это тогда уже не проблемы спирита, а проблемы property_tree. Это в их обязанности входит уведомить пользователя о подводных граблях в многопоточном окружении. И, по-хорошему, им бы надо иметь свой собственный дефайн на этот счет, раз есть зависимость от многопоточности.


Ну вот так странно получается, что 2 библиотеки из состава буста, использующие спирит, предоставляют отличную возможность поиметь проблемы от многопоточности. Т.е. довольно неглупые и квалифицированные люди с задачей прочтения документации и безопасного использования старого спирита не справились. У нас в конторе уровень разработчиков явно ниже. Выводы отсюда, по-моему, вполне очевидные наклевываются.


J>семантические действия в том виде, в каком они былы в первом спирите, во втором не нужны — там парсеры атрибутированы и все можно достать из атрибутов (или дать контейнер/структуру, в который она сама сложит результаты парсинга). Смотри здесь — как раз про то, как внезапно исчезают семантические действия, если заюзать атрибуты.

J>А вот как надо парсить во втором спирите:
J>
J>phrase_parse( first, last
J>            , double_ % ','
J>            , space, v); // v здесь, в парсере о нем ни слова
J>


Доку я читал. Это все, конечно, супер, но, например, в строке эскейпы убрать — задача что со старым спиритом, что с новым не особо очевидная. И если б добры люди не выложили готовое решение на стековерфлоу, я б точно времени на простенький парсер на базе спирита потратил больше, чем на рукопашный.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[18]: Метапрограммисты надоели
От: jazzer Россия Skype: enerjazzer
Дата: 10.10.14 08:55
Оценка:
Здравствуйте, Хон Гиль Дон, Вы писали:

ХГД>Здравствуйте, jazzer, Вы писали:


ХГД>>>Когда там спирита набегает не одна строка, а хотя бы десять, 200 строк низкоуровнего кода уже не выглядят столь ужасными. Лично для меня, естественно.

J>>Вот честно, никогда не имел проблем со спиритом, хотя он у нас используется для парсинга разнообразнейших конфигов только в путь.
J>>парсеры бывают и поболе, чем 10 строк.
J>>Я вот, честно, не вижу ни единого аргумента за то, чтоб писать низкоуровневый код.

ХГД>Очевидно же — высокий порог вхождения. Мне вот парсеры писать нужно бывает редко, грубо говоря раз в год. Поэтому детали я где-то не знаю, где-то не помню. И в целом сложилось впечатление, что я код без спирита быстрее бы писал. Благо и так, и так пробовал.


Да нет там никакого порога, если человек знает EBNF (а это из раздела базовых вещей, имхо).
Все очень естественно и по докам моментально делается, особенно во втором спирите.

J>>На этот счет у меня есть специальный одноклеточный "парсер" throw_p, который прекращает парсинг и бросает исключение со всем необходимым (строка, колонка, объяснение).

J>>Типа:
double_p | uint_p | int_p | throw_p("number expected")

J>>И синтаксические ошибки сразу перестают быть проблемой.

ХГД>А позицию откуда брать?

так throw_p ее получит от сканера, когда до него дойдет очередь, как и любой другой парсер (иначе как парсер будет сканить строку дальше?).
Код такой:
  class ThrowParseError
  {
    std::string error_msg_;
  public:
    typedef boost::spirit::classic::nil_t result_t;
    ThrowParseError(const std::string& s) : error_msg_(s) {}

    template <class ScannerT>
    int operator()(ScannerT const& scan, result_t& /*result*/) const
    {
      throw std::exception( spirit_error::format( error_msg_, scan.first ) );
    }
  };
  typedef boost::spirit::classic::functor_parser< ThrowParseError > throw_p;

scan.first — это оно. spirit_error::format — это моя внутренняя функция, перегруженная для разных типов итераторов (и итератор spirit::classic::position_iterator2 как раз отслеживает строку и колонку).

J>>Ну, батенька, это тогда уже не проблемы спирита, а проблемы property_tree. Это в их обязанности входит уведомить пользователя о подводных граблях в многопоточном окружении. И, по-хорошему, им бы надо иметь свой собственный дефайн на этот счет, раз есть зависимость от многопоточности.


ХГД>Ну вот так странно получается, что 2 библиотеки из состава буста, использующие спирит, предоставляют отличную возможность поиметь проблемы от многопоточности. Т.е. довольно неглупые и квалифицированные люди с задачей прочтения документации и безопасного использования старого спирита не справились. У нас в конторе уровень разработчиков явно ниже. Выводы отсюда, по-моему, вполне очевидные наклевываются.


Никаких тут выводов не наклевывается, кроме выводов о головотяпстве автора property_tree. Такие проблемы могут возникнуть с абсолютно любой библиотекой А, юзающей какую-то другую библиотеку Б, если у Б есть какие-то дополнительные требования, а автор А не потрудился их выяснить и транслировать своим пользователям. Библиотека Б тут ни в чем не виновата — это может быть какая-нть сишная библиотека вообще, пользующая, скажем, какой-нть не thread-safe posix API (tzset, скажем) — автор А обязан своим пользователям об этих ограничениях сказать, даже если собственный код самой А никаких многопоточностей не содержит.

J>>семантические действия в том виде, в каком они былы в первом спирите, во втором не нужны — там парсеры атрибутированы и все можно достать из атрибутов (или дать контейнер/структуру, в который она сама сложит результаты парсинга). Смотри здесь — как раз про то, как внезапно исчезают семантические действия, если заюзать атрибуты.

J>>А вот как надо парсить во втором спирите:
J>>
J>>phrase_parse( first, last
J>>            , double_ % ','
J>>            , space, v); // v здесь, в парсере о нем ни слова
J>>


ХГД>Доку я читал. Это все, конечно, супер, но, например, в строке эскейпы убрать — задача что со старым спиритом, что с новым не особо очевидная. И если б добры люди не выложили готовое решение на стековерфлоу, я б точно времени на простенький парсер на базе спирита потратил больше, чем на рукопашный.


Если честно, я не понял, какое отношение имеет к парсеру задача убирания эскейпов.
Но вообще вот в классическом спирите:
http://www.boost.org/doc/libs/master/libs/spirit/classic/doc/escape_char_parser.html (с поправкой, что это по-символьный парсер — так же можно сделать и Unicode и любой другой разнобайтовый парсер)
и вот на спирите-2:
http://boost-spirit.com/home/articles/qi-example/parsing-escaped-string-input-using-spirit-qi/
благодаря атрибутированности он может вернуть сразу строчку — в классическом пришлось бы push_back-ать каждый символ явным семантическим действием
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Метапрограммисты надоели
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.10.14 09:03
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Это засилье в отрасли понтарезов и олимпиадников, которые не осилили разработку на функциональных ЯП,

S>но которым выпендренуться, по разным причинам, требуется. Они и уцепились за сущности aka "Метапрограммирование,
S>Boost.Fusion, Boost.Mpl...". Но выглянуть из песочницы у них кругозора не хватает.
S>В Lisp красиво, без того уродства, коим являются шаблоны C++, любая, и самая сложная, грамматика, парсится в несколько десятков строк.

Лисп безбожно устарел

Автор Closure, наконец то изобрёл монады. Ну и новый термин сходу выдал — трансдьюсеры. Браво, концепция которая даже в императивных языках появилась 10 лет назад, наконец то появилась в Лиспе

http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming
Re[19]: Метапрограммисты надоели
От: Хон Гиль Дон Россия  
Дата: 10.10.14 09:41
Оценка:
Здравствуйте, jazzer, Вы писали:


ХГД>>Очевидно же — высокий порог вхождения. Мне вот парсеры писать нужно бывает редко, грубо говоря раз в год. Поэтому детали я где-то не знаю, где-то не помню. И в целом сложилось впечатление, что я код без спирита быстрее бы писал. Благо и так, и так пробовал.


J>Да нет там никакого порога, если человек знает EBNF (а это из раздела базовых вещей, имхо).


Как знание EBNF поможет мне узнать способ получения текущей позиции внутри кода семантического действия?

J>Все очень естественно и по докам моментально делается, особенно во втором спирите.


Ну вот например такая ошибка при компиляции:

  многабукоф
1>C:\mi\shared7\boost\boost/fusion/container/vector/convert.hpp(25): error C2903: 'apply' : symbol is neither a class template nor a function template
1>          C:\mi\shared7\boost\boost/mpl/eval_if.hpp(41) : see reference to class template instantiation 'boost::fusion::result_of::as_vector<boost::fusion::filter_view<Sequence,Pred>>' being compiled
1>          with
1>          [
1>              Sequence=boost::fusion::transform_view<boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>,boost::spirit::traits::build_attribute_sequence<boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>,boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::spirit::traits::sequence_attribute_transform,log_collector::iter_t,boost::spirit::qi::domain>::element_attribute,boost::fusion::void_>
1>  ,            Pred=boost::spirit::traits::not_is_unused<boost::mpl::_>
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/support/attributes.hpp(736) : see reference to class template instantiation 'boost::mpl::eval_if<boost::fusion::result_of::empty<boost::fusion::filter_view<Sequence,Pred>>,boost::mpl::identity<boost::spirit::unused_type>,boost::fusion::result_of::as_vector<boost::fusion::filter_view<Sequence,Pred>>>' being compiled
1>          with
1>          [
1>              Sequence=boost::fusion::transform_view<boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>,boost::spirit::traits::build_attribute_sequence<boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>,boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::spirit::traits::sequence_attribute_transform,log_collector::iter_t,boost::spirit::qi::domain>::element_attribute,boost::fusion::void_>
1>  ,            Pred=boost::spirit::traits::not_is_unused<boost::mpl::_>
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/operator/sequence_base.hpp(53) : see reference to class template instantiation 'boost::spirit::traits::build_fusion_vector<boost::fusion::transform_view<Sequence,F,boost::fusion::void_>>' being compiled
1>          with
1>          [
1>              Sequence=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            F=boost::spirit::traits::build_attribute_sequence<boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>,boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::spirit::traits::sequence_attribute_transform,log_collector::iter_t,boost::spirit::qi::domain>::element_attribute
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/operator/sequence_base.hpp(78) : see reference to class template instantiation 'boost::spirit::qi::sequence_base<boost::spirit::qi::sequence<Elements>,Elements>::attribute<Context,Iterator>' being compiled
1>          with
1>          [
1>              Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            Context=boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>
1>  ,            Iterator=log_collector::iter_t
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/operator/sequence_base.hpp(124) : see reference to function template instantiation 'bool boost::spirit::qi::sequence_base<boost::spirit::qi::sequence<Elements>,Elements>::parse_impl<Iterator,Context,Skipper,Attribute>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &,boost::mpl::false_) const' being compiled
1>          with
1>          [
1>              Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            Iterator=log_collector::iter_t
1>  ,            Context=boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>
1>  ,            Skipper=boost::spirit::unused_type
1>  ,            Attribute=log_collector::Record
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/operator/sequence_base.hpp(124) : see reference to function template instantiation 'bool boost::spirit::qi::sequence_base<boost::spirit::qi::sequence<Elements>,Elements>::parse_impl<Iterator,Context,Skipper,Attribute>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &,boost::mpl::false_) const' being compiled
1>          with
1>          [
1>              Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            Iterator=log_collector::iter_t
1>  ,            Context=boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>
1>  ,            Skipper=boost::spirit::unused_type
1>  ,            Attribute=log_collector::Record
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/parse.hpp(86) : see reference to function template instantiation 'bool boost::spirit::qi::sequence_base<boost::spirit::qi::sequence<Elements>,Elements>::parse<Iterator,boost::spirit::context<boost::fusion::cons<T &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::spirit::unused_type,Attr>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' being compiled
1>          with
1>          [
1>              Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            Iterator=log_collector::iter_t
1>  ,            T=log_collector::Record
1>  ,            Attr=log_collector::Record
1>  ,            Context=boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>
1>  ,            Skipper=boost::spirit::unused_type
1>  ,            Attribute=log_collector::Record
1>          ]
1>          C:\mi\shared7\boost\boost/spirit/home/qi/parse.hpp(86) : see reference to function template instantiation 'bool boost::spirit::qi::sequence_base<boost::spirit::qi::sequence<Elements>,Elements>::parse<Iterator,boost::spirit::context<boost::fusion::cons<T &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::spirit::unused_type,Attr>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' being compiled
1>          with
1>          [
1>              Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[14],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<boost::ulong_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[17],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[20],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[18],true>,boost::fusion::cons<boost::spirit::qi::any_uint_parser<unsigned int,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[8],true>,boost::fusion::cons<boost::spirit::qi::any_int_parser<boost::long_long_type,10,1,-1>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[10],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[11],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[16],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_string<const char (&)[13],true>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>>,boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard,true,false>,boost::fusion::nil_>>>>>>>>>>>>>>>>>>>>>>>>>
1>  ,            Iterator=log_collector::iter_t
1>  ,            T=log_collector::Record
1>  ,            Attr=log_collector::Record
1>  ,            Context=boost::spirit::context<boost::fusion::cons<log_collector::Record &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>
1>  ,            Skipper=boost::spirit::unused_type
1>  ,            Attribute=log_collector::Record
1>          ]
1>          log_processor.cpp(208) : see reference to function template instantiation 'bool boost::spirit::qi::parse<log_collector::iter_t,boost::proto::exprns_::expr<Tag,Args,2>,log_collector::Record>(Iterator &,Iterator,const Expr &,Attr &)' being compiled
1>          with
1>          [
1>              Tag=boost::proto::tagns_::tag::shift_right
1>  ,            Args=boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[14]>,0>,const boost::spirit::terminal<boost::spirit::tag::ulong_long> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[10]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[13]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[11]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[17]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[20]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[18]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[8]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::long_long> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[10]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[11]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[16]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[13]>,0>>,2> &,log_collector::escaped_string<log_collector::iter_t> >,2> ,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[2]>,0>>
1>  ,            Iterator=log_collector::iter_t
1>  ,            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right,boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[14]>,0>,const boost::spirit::terminal<boost::spirit::tag::ulong_long> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[10]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[13]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[11]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[17]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[20]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[18]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::uint_> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[8]>,0>>,2> &,const boost::spirit::terminal<boost::spirit::tag::long_long> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[10]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[11]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[16]>,0>>,2> &,const boost::spirit::qi::rule<log_collector::iter_t,std::basic_string<char,std::char_traits<char>,std::allocator<char>> (void),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type> &>,2> &,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[13]>,0>>,2> &,log_collector::escaped_string<log_collector::iter_t> >,2> ,boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<const char (&)[2]>,0>>,2>
1>  ,            Attr=log_collector::Record
1>          ]

Где в доке написано, что надо подкрутить, чтобы ее не было?


ХГД>>А позицию откуда брать?

J>так throw_p ее получит от сканера, когда до него дойдет очередь, как и любой другой парсер (иначе как парсер будет сканить строку дальше?).
J>Код такой:
J>
J>  class ThrowParseError
J>  {
J>    std::string error_msg_;
J>  public:
J>    typedef boost::spirit::classic::nil_t result_t;
J>    ThrowParseError(const std::string& s) : error_msg_(s) {}

J>    template <class ScannerT>
J>    int operator()(ScannerT const& scan, result_t& /*result*/) const
J>    {
J>      throw std::exception( spirit_error::format( error_msg_, scan.first ) );
J>    }
J>  };
J>  typedef boost::spirit::classic::functor_parser< ThrowParseError > throw_p;
J>

J>scan.first — это оно. spirit_error::format — это моя внутренняя функция, перегруженная для разных типов итераторов (и итератор spirit::classic::position_iterator2 как раз отслеживает строку и колонку).

Классик не интересно. Про qi я в доке этого за приемлемое время найти не смог.


J>Никаких тут выводов не наклевывается, кроме выводов о головотяпстве автора property_tree. Такие проблемы могут возникнуть с абсолютно любой библиотекой А, юзающей какую-то другую библиотеку Б, если у Б есть какие-то дополнительные требования, а автор А не потрудился их выяснить и транслировать своим пользователям. Библиотека Б тут ни в чем не виновата — это может быть какая-нть сишная библиотека вообще, пользующая, скажем, какой-нть не thread-safe posix API (tzset, скажем) — автор А обязан своим пользователям об этих ограничениях сказать, даже если собственный код самой А никаких многопоточностей не содержит.


У нас работает народ ничуть не менее склонный к головотяпству, чем авторы property_tree и serialization. Соответственно, с высокой вероятностью так же накосячат. Ну да ладно, классик считай проехали.

J>Если честно, я не понял, какое отношение имеет к парсеру задача убирания эскейпов.


Ну как-то же мне их убирать надо. В рукопашном парсере это задача решается походя. Предлагаешь совмещать спирит с низкоуровневым анескейпером? Тоже вариант, конечно, но по-моему его необходимость (или хотя бы предпочтительность) свидетельствовала бы не в пользу спирита.

J>и вот на спирите-2:

J>http://boost-spirit.com/home/articles/qi-example/parsing-escaped-string-input-using-spirit-qi/
J>благодаря атрибутированности он может вернуть сразу строчку — в классическом пришлось бы push_back-ать каждый символ явным семантическим действием

Я с другого источника драл, но тут тоже отличная иллюстрация к вопросу о низком пороге вхождения. Вот про qi::_r1 я откуда знать должен — из EBNF или таки придется доку штудировать? Еще я вижу, что вместо единожды скомпилированного куска делаются какие-то манипуляции в рантайме. В конструкторе unescaped_string какой-то контейнер содержимым набивают. Т.е., если нужна скорость, в случае сложного парсера мне уже придется выносить его на верхний уровень и протягивать к месту использования в параметрах, чтобы на каждый чих не создавать/разрушать. Да, и я там например хочу на незнакомые эскейпы ругаться "unrecognized escape sequence", с указанием позиции — как добавить?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[20]: Метапрограммисты надоели
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.10.14 10:00
Оценка: -2
Здравствуйте, Хон Гиль Дон, Вы писали:

ХГД>Где в доке написано, что надо подкрутить, чтобы ее не было?

дока моцг не заменит, да.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[21]: Метапрограммисты надоели
От: Хон Гиль Дон Россия  
Дата: 10.10.14 10:21
Оценка: +2
Здравствуйте, niXman, Вы писали:

ХГД>>Где в доке написано, что надо подкрутить, чтобы ее не было?

X>дока моцг не заменит, да.

Это было опровержение утверждения

"Да нет там никакого порога, если человек знает EBNF (а это из раздела базовых вещей, имхо). Все очень естественно и по докам моментально делается, особенно во втором спирите."

, если кто не понял.
Тут доки мало, тут желательно немножко опыта работы с конкретной либой, чтобы потом не тупить над такими ошибками подолгу. Вот тебе что конкретно моск подсказывает на счет этой ошибки? Сообщение об ошибке, которое я привел, содержит достаточно информации, чтобы при желании можно было сказать как это фиксить. Только вот времени у типичного программиста это займет нифга не мало. А некоторые так может и вовсе не осилят.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[22]: Метапрограммисты надоели
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.10.14 10:24
Оценка:
Здравствуйте, Хон Гиль Дон, Вы писали:

ХГД>Это было опровержение утверждения


ну епс, нужно знать инструмент который используешь. подобные простыни получаются не только при использовании спирита.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[23]: Метапрограммисты надоели
От: Хон Гиль Дон Россия  
Дата: 10.10.14 11:41
Оценка:
Здравствуйте, niXman, Вы писали:

X>ну епс, нужно знать инструмент который используешь. подобные простыни получаются не только при использовании спирита.


Как раз это и называется "высокий порог вхождения"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[24]: Метапрограммисты надоели
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.10.14 11:43
Оценка:
Здравствуйте, Хон Гиль Дон, Вы писали:

ХГД>Как раз это и называется "высокий порог вхождения"

думается мне, тут последовательность другая.
тот кто только "входит в с++" — вряд ли станет юзать спирит. а тот кто сознательно и объективно выбирает спирит — уже имеет весь необходимый "багаж знаний", чтоб понять о чем простыня размером в *надцать страниц. но это ИМХО, конечно.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Метапрограммисты надоели
От: kurchatov  
Дата: 10.10.14 11:51
Оценка:
Отладка компиляции — это прекрасно. Какие средства предоставляет буст для отладки метапрограмм?
Re[2]: Метапрограммисты надоели
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.10.14 11:55
Оценка: -2
Здравствуйте, kurchatov, Вы писали:

K>Какие средства предоставляет буст для отладки метапрограмм?

как же ты любишь винить в своей некомпетентности что-то кроме себя =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.