Как правильно работать с неизвестными символами в spirit::x3?

Новичок для x3... Код адаптирован из roman.cpp в туториале x3. Предположим, у меня есть таблица символов, как показано ниже:

struct car_models_ : x3::symbols<char, unsigned>
{
    car_models_()
    {
        add
            ("sedan", 1)
            ("compact", 2)
            ("suv", 3)
        ;
    }
} car_models;

Затем разберите,

char const *first = "Model: sedan";
char const *last = first + std::strlen(first);
parse(first, last, "Model: " >> car_models[action()]);

Если в таблице символов нет новой модели, как правильно с ней обращаться? Есть ли способ добавить подстановочный знак в качестве последней записи в таблице символов, а затем каким-то образом передать неизвестную модель в действие (например, число «0» в этом случае)?


person user180574    schedule 18.03.2019    source источник


Ответы (1)


Внутри самой таблицы символов это сделать невозможно. Одна из возможностей:

auto ext_car_models = car_models | (x3::omit[*x3::lower] >> attr(0))

Затем для разбора:

parse(first, last, "Model: " >> ext_car_models[action()]);

На мгновение игнорируя атрибут, ваша таблица символов фактически является синтаксическим сахаром для:

x3::string("sedan") | "compact" | "suv"

Таким образом, обработка неизвестной строки в этой позиции должна осуществляться таким же образом. Вам нужно будет определить синтаксический анализатор, который определяет, как выглядит строка модели. Возможно *x3::lower

person mhhollomon    schedule 24.03.2019