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)
我正在尝试创建一个简单的解析器,如下所示。但是,我不确定为什么组合器解析器在存在 '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)