对于Spirit :: x3,处理未知符号的正确方法是什么?

时间:2019-03-18 20:12:07

标签: boost-spirit-x3

x3的新手...该代码改编自x3教程中的roman.cpp。假设我有一个如下的符号表:

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 :(得分:0)

没有办法在符号表本身中执行此操作。一种可能性是:

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