gpt4 book ai didi

scala - 在 Scala 中解析 SemVer

转载 作者:行者123 更新时间:2023-12-04 18:05:12 26 4
gpt4 key购买 nike

我正在尝试使用解析器组合器在 Scala 中编写一个 SemVer ( http://semver.org) 解析器,作为对它们的一种熟悉。

这是我当前的代码:

case class SemVer(major: Int, minor: Int, patch: Int, prerelease: Option[List[String]], metadata: Option[List[String]]) {
override def toString = s"$major.$minor.$patch" + prerelease.map("-" + _.mkString(".")).getOrElse("") + metadata.map("+" + _.mkString("."))
}

class VersionParser extends RegexParsers {
def number: Parser[Int] = """(0|[1-9]\d*)""".r ^^ (_.toInt)
def separator: Parser[String] = """\.""".r
def prereleaseSeparator: Parser[String] = """-""".r
def metadataSeparator: Parser[String] = """\+""".r
def identifier: Parser[String] = """([0-9A-Za-z-])+""".r ^^ (_.toString)

def prereleaseIdentifiers: Parser[List[String]] = (number | identifier) ~ rep(separator ~> (number | identifier)) ^^ {
case first ~ rest => List(first.toString) ++ rest.map(_.toString)
}

def metadataIdentifiers: Parser[List[String]] = identifier ~ rep(separator ~> identifier) ^^ {
case first ~ rest => List(first.toString) ++ rest.map(_.toString)
}
}

我想知道我应该如何解析预发布部分的标识符,因为它不允许在数字标识符中使用前导零,并且当我尝试使用我当前的解析器前导零(例如在“01.2.3”中)简单地进行解析时成为包含元素 0 的列表。

更一般地说,我应该如何检测字符串不符合 SemVer 规范并因此强制出现故障条件?

最佳答案

经过一些尝试和搜索,我发现问题是我调用了 parse方法而不是 parseAll方法。自 parse基本上尽可能多地解析,当它不能再解析时结束,它有可能接受部分正确的字符串。使用 parseAll强制解析所有输入,如果解析停止后仍有输入,则失败。这正是我要找的。

关于scala - 在 Scala 中解析 SemVer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28437555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com