Scala的解析器,有时跳过空白,有时不(Scala Parser that sometimes s

2019-09-17 15:11发布

我有一个工作斯卡拉解析器但解决的办法是不干净的,我想。 问题是,一些生产必须考虑空格作为标记,但“更高级别”的作品应该能够忽略/跳过空白的一部分。

如果我使用延伸的下水平解析器的典型的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)}

Answer 1:

难道不是更有意义打开第一分析器进入令牌分析器(词法分析器,真的),使第二解析器读取的是不是纯Char



Answer 2:

一个解决方案是重写handleWhiteSpace功能和激活跳过空白在你扩展的类VAR值。

:你可以在这里看到RegexParsers的代码https://github.com/scala/scala/blob/v2.9.2/src/library/scala/util/parsing/combinator/RegexParsers.scala



文章来源: Scala Parser that sometimes skips whitespace and sometimes does not
标签: parsing scala