Scala组合器解析器:重复中的重复和后续连接规则子集

时间:2016-04-12 16:20:52

标签: scala

我正在使用scala组合器解析字符串,我想要像 “Ph”或“Ph。”或“Ph.D”或“Ph.D.”要成功解析,其中三个第一个被成功解析,但当我执行println(parseAll(name, "Ph.D."))时,我看到以下内容:

[1.6] failure: string matching regex `\p{IsLatin}+' expected but end of source found

Ph.D.
     ^

我的直觉是因为nameSepSubsetnameSep使用的规则,rep1(nameSub ~ nameSep)会消耗“博士”中的所有内容。因此不会产生nameSub ~ nameSepSubset的输入。 是否有另一个运算符而不是rep1或另一种定义我的语法的方法来解决这个问题?

语法:

lazy val nameSub = """[a-zA-Z]+""".r
lazy val nameSepSubset = (
    rep1(" ")
    ||| "." ~ rep1(" ")
    ||| ".")

lazy val nameSep = (
        nameSepSubset
        ||| rep(" ") ~ "," ~ rep(" ")
        ||| rep(" ") ~> "-" <~ rep(" ")
        ||| "'")


lazy val name = (rep1(nameSub ~ nameSep) ~ nameSub ~ nameSepSubset
                 ||| nameSub ~ nameSepSubset)

0 个答案:

没有答案