Для Spirit :: x3, как правильно обращаться с неизвестными символами? - PullRequest
0 голосов
/ 18 марта 2019

Новичок для 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» в этом случае)?

1 Ответ

0 голосов
/ 24 марта 2019

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

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

...