C++ 指定没有解释范围的字符集

C++ 指定没有解释范围的字符集,c++,boost,boost-spirit-qi,boost-spirit,C++,Boost,Boost Spirit Qi,Boost Spirit,当我必须在规则中定义减号时,我对解析字符串感到非常困惑,它只是一个减号字符,而不是两个端点之间的字符范围 例如,当您编写规则以对通常会编写的字符串进行百分比编码时 *(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]); 如果您想确保负号被视为负号,而不是一个范围,您可以按以下方式更改代码(根据下面的@sehe建议)。 void spirit\u direct(std::vec

当我必须在规则中定义减号时,我对解析字符串感到非常困惑,它只是一个减号字符,而不是两个端点之间的字符范围

例如,当您编写规则以对通常会编写的字符串进行百分比编码时

*(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]);
如果您想确保负号被视为负号,而不是一个范围,您可以按以下方式更改代码(根据下面的@sehe建议)。

void spirit\u direct(std::vector&result,const std::string)&
输入,字符常量*分隔符)
{
result.clear();
符号符号;
std::字符串分隔符=分隔符;
用于(自动通道:分离器)
{
符号添加(std::string(1,ch));
}
使用名称空间bsq;
如果(!parse(input.begin(),input.end(),raw[*(char\u-sym\ux)]%sym\ux,result))
结果。推回(输入);
}
看起来很优雅。 在使用静态常量规则的情况下,我想我可以用“\”转义字符,方括号是指那些需要转义的“特殊”字符之一。为什么?[]的含义是什么?是否还有其他要转义的字符?

简单

您可以设计并指定用户可以提供其含义的支持模式

其次,

  • 您可以编写将其转换为字符集的代码(例如,扩展所有范围(如果用户输入中支持),并根据定义将
    -
    排序为第一个字符)

  • 完全不要使用字符集

    • 为什么不使用
      char\u[\ u pass=my\u match\u谓词(\u 1)]
    • 为什么不只是交替使用文字字符呢<代码>灯光('a')|'b'|'-'|'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
    • 为什么不使用
      qi::symbols
      (或者甚至将
      qi::sym\u;
      raw[sym\uz]
      或类似产品一起使用)

      更新这种
      qi::symbols
      方法速度惊人:。我最近的一份优化工作让我失望:看看这个答案(在“Spirit(Trie)”下)——


总的来说,我不知道你想要实现什么,但Spirit并不适合动态生成规则。请参阅本网站中的一些我已有的答案。

您是否尝试使用\ <代码> BK::CARAY(“AZ-ZO-9}-<?”)/<代码> < /P> Ho Ho,你有很多:让我们看看你的答案,考虑“定界符”是“,”-~”然后它将捕获4个定界符(‘,’,’,’,’,’},’~’’,当乔平均值意味着4个定界符,但是,‘,’,‘,’,‘-’,‘~’。我不能为输入指定太“远”的模式,它应该是向后兼容的(减号只是意味着减号)。至于接下来的几点——1)不优雅。看起来很笨重,但也许我没弄明白。2b)好得多,但又不是优雅的顶点。2c)看起来就像医生说的那样ordered@kreuzerkrieg“它应该向后兼容”-看,这是您的规范!关于链接的答案?就这样,这不是我的规格。。。说来话长。。。订购的东西-好的,它是好的和丑陋的:)嗯,符号的东西更可读,更容易理解understanding@kreuzerkriegOT但那是因为你在向帖子的作者(Q或A)致辞,而评论线程中没有其他人参与。有点违反,但哦,好吧:)事实上。。。打那个。
qi::symbols
方法速度惊人:。我最近做了一个优化工作,结果令人失望:没有,因为我正在寻找一个类似于禁用特殊字符的指令meaning@kreuzerkrieg它不存在。
void spirit_direct(std::vector<std::string>& result, const std::string& input, char const* delimiter)
{
    result.clear();
    using namespace bsq;
    if(!parse(input.begin(), input.end(), raw[*(char_ - char_(delimiter))] % char_(delimiter), result))
        result.push_back(input);
}
void spirit_direct(std::vector<std::string>& result, const std::string&
    input, char const* delimiter)
{
    result.clear();
    bsq::symbols<char, bsq::unused_type> sym_;
    std::string separators = delimiter;
    for(auto ch : separators)
    {
        sym_.add(std::string(1, ch));
    }
    using namespace bsq;
    if(!parse(input.begin(), input.end(), raw[*(char_ - sym_)] % sym_, result))
        result.push_back(input);
}