dom*_*mna 3 scala parser-generator
我正在尝试编写一个解析器,它应该将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
}
Run Code Online (Sandbox Code Playgroud)
是否有可能将前两个解析器的类型参数转换为更具体的?类似于任意维度但具有相同底层类型的嵌套列表的一般参数.
我认为它应该是树,这是嵌套到任意深度的列表的正确结构
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(", ") + ")"
}
Run Code Online (Sandbox Code Playgroud)
(根据需要使用toString,但我认为默认的是相当冗长的)
然后,对你的语法进行一些小修复(+解析方法,只是为了在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]")
Run Code Online (Sandbox Code Playgroud)
res0:PrologList.ParseResult [Tree [String]] = [1.42]解析:节点(a,b,节点(c,节点(d,e),f,节点(g),h),节点(i,j) ,k)