使用scala parser-combinators解析消耗除最后一个元素以外的所有元素的列表的正确方法是什么?例如,如果我想将“垃圾邮件,垃圾邮件,垃圾邮件和鸡蛋”解析为List(“ spam”,“ spam”,“ spam”,“ spam”)〜“ spam and eggs”。
如果我只使用“垃圾邮件”。+,那么在我匹配“垃圾邮件和鸡蛋”之前,所有垃圾邮件都已被消耗掉。自然地,我可以匹配“和鸡蛋”,但实际上我可能已经有一个我不想改变的复杂的“垃圾邮件和鸡蛋”解析器。
这里是一个简单但效率低下的版本:
def allButOne[T](p: Parser[T]): Parser[List[T]] = (p <~ guard(p)).+