Scala - 组合器解析器不正确 - repsep

Scala - combinator parser incorrect - repsep

我正在尝试创建一个简单的解析器,如下所示。但是,我不确定为什么组合器解析器在存在 'dates' 格式时抱怨无法识别 'floatingPointNumber' 。它识别何时 'ident'

下面是有错误的代码。

非常感谢您的帮助!

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)
                         ^

假设您希望至少有一个 date出现在dates中,使用

def dates = rep1sep(date, ";")

似乎解决了这个问题。

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

def fixedDates = rep1sep(date, ";")
def fixedValue = ident | fixedDates | date | floatingPointNumber
def fixedObj = "("~>repsep(fixedValue,",")<~")"

parseAll(fixedObj, "(22-Jan-2016;09-Mar-2015,32)")
// MyParser.ParseResult[List[Object]] = 
// [1.29] parsed: List(List(22-Jan-2016, 09-Mar-2015), 32)