新手精神没有尝试替代品

时间:2014-09-02 16:57:25

标签: boost-spirit boost-spirit-qi

我无法让Spirit尝试替代方案。我是Spirit的新手并且可能做了一些非常错误的事情,所以我为拖延SNR而道歉但是感谢任何帮助:

我使用类似下面的语法来匹配“角色类”

'[' >> *(~ascii::char_("-]^") | (ascii::char_ >> '-' >>ascii::char_)) >> ']'

这匹配[abc]但不匹配[a-c]。如果我删除了第一个备选方案,则[a-c]匹配。当第一个失败时,Spirit是否应该尝试第二种选择?

谢谢,

麦克

1 个答案:

答案 0 :(得分:2)

基本问题是第一个替代 匹配 - 它只是不匹配你想要的。如上所述,您的解析器匹配3个序列的序列,中间的一个是重复的模式,其中有一个替代。

   '['                   // single char match
>> *(~ascii::char_("-]^") | (ascii::char_ >> '-' >>ascii::char_))  // complex pattern
>> ']'                   // single char match

因此,让我们看看当您尝试匹配[a-c]时会发生什么。首先,匹配模式'[',该模式成功并离开a-c]。那么它会查看复杂模式,它会尝试匹配0次或更多次。在*重复之后,它首先尝试匹配~ascii::char_("-]^")的{​​{1}},因此成功离开a。然后重复,尝试再次匹配该模式,失败(-c]不匹配),因此它尝试-匹配ascii::char的第二个替代,但{{1 }}与-不匹配,因此失败。因此,'-'匹配的结尾与单个字符c匹配。最后,它会尝试匹配*失败的a,因此整体匹配失败。

阅读上面的内容(如果你能理解它)应该清楚你需要做什么 - 在尝试']'循环中的单个字符匹配之前,你需要尝试范围匹配:

-

现在它应该匹配*'[' >> *((ascii::char_ >> '-' >>ascii::char_) | ~ascii::char_("-]^")) >> ']' 以及[abc]之类的内容。