gpt4 book ai didi

scala - 嵌套列表的通用类型参数

转载 作者:行者123 更新时间:2023-12-01 11:04:35 29 4
gpt4 key购买 nike

我正在尝试编写一个解析器,它将 Prolog 列表(例如 [1,2,3,4])解析为相应的 Scala 列表。我使用 Scalas 解析组合器对解析器进行了编程。

到目前为止,我的解析器看起来像这样:

class PListParser extends JavaTokenParsers{
def list:Parser[List[Any]] = "[" ~> listArgs <~ "]"
def listArgs:Parser[List[Any]] = list | repsep(args, ",")
def args:Parser[String] = "(.)*".r
}

有没有可能将前两个解析器的类型参数变成更具体的东西?类似于任意维度的嵌套列表的通用参数,但底层类型相同。

最佳答案

我认为它应该是树,这是嵌套到任意深度的列表的正确结构

sealed trait Tree[A]
case class Leaf[A](value: A) extends Tree[A] {
override def toString: String = value.toString
}
case class Node[A](items: List[Tree[A]]) extends Tree[A] {
override def toString: String = "Node(" + items.mkString(", ") + ")"
}

(随意使用 toString,但我认为默认的太冗长了)

然后,对你的语法进行小的修正(+ parse 方法,只是为了在 REPL 上轻松测试)

object PrologListParser extends JavaTokenParsers{
    def list:Parser[Tree[String]] = "[" ~> listArgs <~ "]"
    def listArgs:Parser[Tree[String]] = repsep(list | args, ",") ^^ {Node(_)}
    def args:Parser[Tree[String]] = """([^,\[\]])*""".r ^^ {Leaf(_)}
def parse(s: String): ParseResult[Tree[String]] = parse(list, s)
}


PrologListParser.parse("[a, b, [c, [d, e], f, [g], h], [i, j], k]")

res0: PrologList.ParseResult[Tree[String]] = [1.42] parsed: Node(a, b, Node(c, Node(d, e), f, Node(g), h), Node(i, j), k)

关于scala - 嵌套列表的通用类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262574/

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