の解析:スカラ:私はScalaの構文解析コンビネータライブラリで自分自身を理解を助けるために、おもちゃのHTMLパーサで遊んだマッチングトークン
import scala.util.parsing.combinator._
sealed abstract class Node
case class TextNode(val contents : String) extends Node
case class Element(
val tag : String,
val attributes : Map[String,Option[String]],
val children : Seq[Node]
) extends Node
object HTML extends RegexParsers {
val node: Parser[Node] = text | element
val text: Parser[TextNode] = """[^<]+""".r ^^ TextNode
val label: Parser[String] = """(\w[:\w]*)""".r
val value : Parser[String] = """("[^"]*"|\w+)""".r
val attribute : Parser[(String,Option[String])] = label ~ (
"=" ~> value ^^ Some[String] | "" ^^ { case _ => None }
) ^^ { case (k ~ v) => k -> v }
val element: Parser[Element] = (
("<" ~> label ~ rep(whiteSpace ~> attribute) <~ ">")
~ rep(node) ~
("</" ~> label <~ ">")
) ^^ {
case (tag ~ attributes ~ children ~ close) => Element(tag, Map(attributes : _*), children)
}
}
私は私が欲しい実現していますどのようなことは、私のことを確認するためにいくつかの方法です。開始タグと終了タグが一致します。私はそれをすると思う
は、私はので、私は終了タグのためのパーサを構築するために開始タグを使用することができます 、flatMap
コンビネータ〜Parser[A] => (A => Parser[B]) => Parser[B]
のいくつかの並べ替えを必要とします。しかし、私はその署名と一致するものは表示されませんin the library。
これを行うには適切な方法はありますか?