我无法让Spirit尝试替代方案。我是Spirit的新手并且可能做了一些非常错误的事情,所以我为拖延SNR而道歉但是感谢任何帮助:
我使用类似下面的语法来匹配“角色类”
'[' >> *(~ascii::char_("-]^") | (ascii::char_ >> '-' >>ascii::char_)) >> ']'
这匹配[abc]
但不匹配[a-c]
。如果我删除了第一个备选方案,则[a-c]
匹配。当第一个失败时,Spirit是否应该尝试第二种选择?
谢谢,
麦克
答案 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]
之类的内容。