加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:解析匹配令牌

发布时间:2020-12-16 18:32:29 所属栏目:安全 来源:网络整理
导读:我正在玩一个玩具 HTML解析器,以帮助我熟悉 Scala的解析组合库: 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 : Ma
我正在玩一个玩具 HTML解析器,以帮助我熟悉 Scala的解析组合库:

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])=>解析器[B],
所以我可以使用开始标记来构造结束标记的解析器.但我没有看到任何与该签名in the library匹配的内容.

这样做的正确方法是什么?

解决方法

你正在寻找错误的地方.不过,这是一个正常的错误.你想要一个方法Parser [A] => (A => Parser [B])=>解析器[B],但你查看了解析器的文档,而不是解析器.

看here.

有一个flatMap,也称为into或>>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读