Ошибки компилятора при разборе в x3 :: option - PullRequest
0 голосов
/ 08 сентября 2018

Я делаю более или менее первые шаги с X3, и мне уже удалось проанализировать простую структуру с 2 членами. Но я не могу поместить эту структуру в вариант.

(упрощенный) код выглядит примерно так:

struct Command1
{
            CommandType type;
            std::string objName;
}
BOOST_FUSION_ADAPT_STRUCT(
    Command1,
    type, objName
);

struct Nil {};
using Command = x3::variant<Nil, Command1>;

const x3::rule<struct create_cmd_rule, Command1> ccRule = "ccRule";
const auto ccRule_def = typeRule > identifier;

const x3::rule<struct create_rule, Command> cRule = "cRule";
const auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule_def);

Если я назову это так

Command1 cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule_def, x3::space, cmd);

все хорошо. Но если я передам свой вариант:

Command cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule_def, x3::space, cmd);

не компилируется: Код серьезности Описание Состояние подавления строки файла проекта Ошибка C2665 'boost :: spirit :: x3 :: traits :: detail :: move_to': ни одна из 4 перегрузок не может преобразовать все типы аргументов ZeusCore d: \ boost_1_67_0 \ boost \ spirit \ home \ x3 \ support \ traits \ move_to.hpp 224

Надеюсь, я не сильно упростил код ...

Я использую Boost 1.67 и новейшую версию Visual Studio 2017.

1 Ответ

0 голосов
/ 09 сентября 2018

Из того, что вы разместили, кажется, что проблема в ссылке *_def. cRule_def и ccRule_def - это правила , а не , это просто цепочки парсеров, хранящихся в переменных.

Попробуйте заменить:

const auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule_def);

с:

const auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule);

BOOST_SPIRIT_DEFINE(cRule, ccRule);

и назовите это как:

Command1 cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule, x3::space, cmd);

Вот игрушечный рабочий пример, который я использовал, чтобы попытаться повторить ошибку https://wandbox.org/permlink/BMP5zzHxPZo7LUDi

Другое примечание: x3::omit в x3::omit[x3::no_case["CREATE"]] является избыточным.

...