这是一个与Scala: How to combine parser combinators from different objects非常相似的问题,但不同之处在于那里提出的解决方案对我的用例不起作用。
考虑到Scala Parser Combinators的文档有点稀疏,我一直无法找到解决方案,但我也是Scala的新手,所以可能是我错过了一些东西。
问题陈述:我正在尝试将两个正则表达式解析器组合在一起,以非常不同的方式处理空白。根据上述问题的解决方案,我已将我想要组合的解析器组合到trait
中供我的类使用。问题是一个解析器组合器会覆盖skipWhitespace
的{{1}}成员,而另一个则不会:
RegexParsers
问题:我如何利用// This parser handles whitespace in a very particular way
trait WhiteSpaceParser extends RegexParsers {
override def skipWhitespace = false
def myWhiteSpaceParser: Parser[Any] = // <special whitespace CFG implementation>
}
// This parser does not care about whitespace, except where myWhiteSpaceParser is used
class DocumentParser extends RegexParsers with WhiteSpaceParser
{
// This parser must skip whitespace, i.e., skipWhitespace = true
def myDocumentParser: Parser[Any] = // <implementation that uses myWhiteSpaceParser>
}
从myWhiteSpaceParser
内部以非常特殊的方式处理空格,其中应忽略空格(除此异常外)?一种解决方案是在任何地方处理空白,但在整个DocumentParser
中需要进行大量更改,并且更容易出错。我希望还有另一种方式。
谢谢!