【问题标题】:General type parameter for nested lists嵌套列表的通用类型参数
【发布时间】:2011-08-31 19:49:07
【问题描述】:

我正在尝试编写一个解析器,它应该将 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
}

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

【问题讨论】:

    标签: scala parser-generator


    【解决方案1】:

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

    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] 解析:Node(a, b, Node(c, Node(d, e), f, Node(g), h), Node(i , j), k)

    【讨论】:

      【解决方案2】:

      (未测试)

      sealed trait PrologTerm
      
      case class PInt(i: Integer) extends PrologTerm { 
        override def toString = i.toString 
      }
      case class PAtom(s: String) extends PrologTerm { 
        override def toString = s.toString 
      }
      case class PComplex(f: PAtom, args: List[PrologTerm]) extends PrologTerm {
        override def toString = f.toString+"("+args.mkString(", ")+")"
      }
      case class PList(items: List[PrologTerm]) extends PrologTerm {
        override def toString = "["+items.mkString(", ")+"]"
      }
      
      object PrologListParser extends JavaTokenParsers {
        def term : Parser[PrologTerm] = int | complex | atom | list
        def int : Parser[PInt] = wholeNumber ^^ {s => PInt(s.toInt)}
        def complex : Parser[PComplex] = 
          (atom ~ ("(" ~> repsep(term, ",") <~ ")")) ^^ {case f ~ args => PAtom(f, args)}
        def atom : Parser[PAtom] = "[a-z][a-zA-Z_]*".r ^^ {PAtom(_)}
        def list : Parser[PList] = ("[" ~> repsep(term, ",") <~ "]") ^^ {PList(_)}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多