Я разбираю некоторые данные, которые смутно структурированы как код C-ish. Как это:Дух Ци: полностью игнорирование вывода некоторых правил
Name0
{
Name1
{
//A COMMENT!!
Param0 *= 2
Param2 = "lol"
}
}
Частично это комментарии, которые я хочу, чтобы полностью игнорировать (и это не работает). Я считаю, что две вещи должны быть node
, названные области (category
правило), как Name0 {}
, и значения (param
правило), как Param0 *= 2
... тогда есть comment
. Я попытался установить вещи, как это:
typedef boost::variant<boost::recursive_wrapper<Category>, Param> Node;
qi::rule<Iterator, Node(), ascii::space_type> node;
Так node
правило ставит либо Category
или Param
в variant
. Здесь другие правила (я опустил некоторые правила, которые на самом деле не важны для этого):
qi::rule<Iterator> comment; //comment has no return type
qi::rule<Iterator, Category(), ascii::space_type> category;
qi::rule<Iterator, Param(), ascii::space_type> param;
И их фактический код:
comment = "//" >> *(char_ - eol);
param %=
tagstring
>> operators
>> value;
category %=
tagstring
>> '{'
>> *node
> '}';
node %= comment | category | param;
comment
является установка использовать =
вместо %=
, и он не имеет типа возврата. Тем не менее, комментарии заканчиваются созданием нулевого Category
s в моем выходе Node
s, где бы они ни появлялись. Я пытался двигаться comment
из node
правила и в category
так:
category %=
tagstring
>> '{'
>> *(comment | node)
> '}';
и различные другие вещи, но эти пустые записи держать выскакивают. Я должен был сделать comment
вывод строки и поставить std::string
в мой Node
variant
просто, чтобы сортировать их, но это испортило мою способность придерживаться комментариев в других частях моих правил (если я фактически не захватил строку в каждом месте).
Как я могу полностью игнорировать comment
и не показывать его каким-либо образом?
редактировать: Можно подумать, что omit
бы это сделать, но, похоже, ничего не менять ...
редактировать 2: Реферирование this SO answer, у меня есть шаткое решение в этом:
node %= category | param;
category %=
tagstring
>> '{'
>> *comment >> *(node >> *comment)
> '}';
Тем не менее, я хочу попытаться вставить комментарии во всевозможные места (между tagstring
и {
, в моем не показанном root
правиле между корнем category
и т. Д.). Существует ли более простой метод? Я надеялся, что это можно сделать с помощью простого >> commentwrapper
, подключенного туда, где я хотел ...
Шкиперы - это путь. Пожалуйста, посмотрите на этот вопрос для примера: http://stackoverflow.com/questions/21672316/boost-spirit-skipper-compile-time-error –
@MikeM Спасибо за эту ссылку! Исправлена проблема, и я точно описал, как в моем ответе. – user173342