Scala - combinator解析器不正确 - repsep

时间:2016-05-08 14:08:14

标签: scala parser-combinators

我正在尝试创建一个简单的解析器,如下所示。但是,我不确定为什么组合器解析器抱怨不能识别浮点数#39;如果有“约会”日期'格式。它识别何时识别'

以下是有错误的代码。

非常感谢您的帮助!

import scala.util.parsing.combinator.JavaTokenParsers

class MyParser extends JavaTokenParsers {
  def dates = repsep(date, ";")
  def date = """\d{2}-[a-zA-Z]{3}-\d{4}""".r
  def value = ident | dates | date | floatingPointNumber
  def obj = "("~>repsep(value,",")<~")"
}
object MyParser extends MyParser { 
  def main(args: Array[String]): Unit = {   
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015)"))
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015,blah3)"))
    println(parseAll(obj, "(22-Jan-2016;09-Mar-2015,32)"))
  }
}

[1.26] parsed: List(List(22-Jan-2016, 09-Mar-2015))
[1.32] parsed: List(List(22-Jan-2016, 09-Mar-2015), blah3)
[1.26] failure: `)' expected but `3' found
(22-Jan-2016;09-Mar-2015,32)
                         ^

1 个答案:

答案 0 :(得分:0)

假设您希望date中存在至少一个 dates,请使用

def dates = rep1sep(date, ";")

似乎解决了这个问题。

我相信原因是dates解析器能够接受一个空字符串(即&#34;&#34;将解析为Nil),这导致{{1永远不会评估floatingPointNumber解析器的一部分。如果您更改value以使其无法接受空输入,则解析成功:

dates