我有一个工作斯卡拉解析器但解决的办法是不干净的,我想。 问题是,一些生产必须考虑空格作为标记,但“更高级别”的作品应该能够忽略/跳过空白的一部分。
如果我使用延伸的下水平解析器的典型的Scala解析器图案,然后skipWhitespace设置继承,事情变得混乱很快。
我想我会是最好不要使用扩展方法,而是在更高层次分析器类提供的低级别解析器的实例 - 但我不知道如何使这项工作,使得每个实例都将看到输入字符只有一个流。
这里是最低级别的解析器的一部分 -
class VulgarFractionParser extends RegexParsers {
override type Elem = Char
override val whiteSpace = "".r
然后我伸出像
class NumberParser extends VulgarFractionParser with Positional {
但在这一点上,NumberParser必须明确处理空白就像FractionParser。 对于NumberParser它仍然是非常便于管理-但在上一级我真的希望能够只定义确实使用空格作为分隔符,就像一个正常的regexParser会做制作。
一个例子是这样的:
IBM 33.33/ 1200.00
or
IBM 33.33/33.50 1200.00
所述第二值有时具有两个质量份的“/”分开,有时仅具有与斜线(或甚至不含有斜线的话)之后没有什么单个部件。
def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3)
def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ {
case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b))
}
def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) }
def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)}