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

Scala解析器组合器和换行符分隔文本

发布时间:2020-12-16 09:10:48 所属栏目:安全 来源:网络整理
导读:我正在写一个 Scala解析器组合器语法,它读取换行符分隔的单词列表,其中列表由一个或多个空白行分隔.给出以下字符串: catmousehorseappleorangepear 我想要它返回列表(列表(猫,老鼠,马),列表(苹果,橙色,梨)). 我写了这个基本的语法,将单词列表作为换行符分隔
我正在写一个 Scala解析器组合器语法,它读取换行符分隔的单词列表,其中列表由一个或多个空白行分隔.给出以下字符串:

cat
mouse
horse

apple
orange
pear

我想要它返回列表(列表(猫,老鼠,马),列表(苹果,橙色,梨)).

我写了这个基本的语法,将单词列表作为换行符分隔的单词.请注意,我必须覆盖空白的默认定义.

import util.parsing.combinator.RegexParsers

object WordList extends RegexParsers {

    private val eol = sys.props("line.separator")

    override val whiteSpace = """[ t]+""".r

    val list: Parser[List[String]] = repsep( """w+""".r,eol)

    val lists: Parser[List[List[String]]] = repsep(list,eol)

    def main(args: Array[String]) {
        val s =
          """cat
            |mouse
            |horse
            |
            |apple
            |orange
            |pear""".stripMargin

        println(parseAll(lists,s))
    }
}

这将空行错误地视为空字列表,即它返回

[8.1] parsed: List(List(cat,mouse,horse),List(),List(apple,orange,pear))

(注意中间的空列表.)

我可以在每个列表的末尾放置一个可选的行尾.

val list: Parser[List[String]] = repsep( """w+""".r,eol) <~ opt(eol)

这样处理列表之间有一个空白行的情况,但是对于多个空白行也有同样的问题.

我尝试更改列表定义以允许多个行尾分隔符:

val lists:Parser[List[List[String]]] = repsep(list,rep(eol))

但是这挂在上面的输入.

什么是正确的语法,将处理多个空行作为分隔符?

解决方法

您应该尝试将 skipWhitespace设置为false,而不是重新定义空格的定义.您使用空列表的问题是由于repsep不会在列表末尾使用换行符.相反,您应该在每个项目后解析换行符(或可能的输入结束):

import util.parsing.combinator.RegexParsers

object WordList extends RegexParsers {

  private val eoi = """z""".r // end of input
  private val eol = sys.props("line.separator")
  private val separator = eoi | eol
  private val word = """w+""".r

  override val skipWhitespace = false

  val list: Parser[List[String]] = rep(word <~ separator)

  val lists: Parser[List[List[String]]] = repsep(list,rep1(eol))

  def main(args: Array[String]) {
    val s =
      """cat
        |mouse
        |horse
        |
        |apple
        |orange
        |pear""".stripMargin

    println(parseAll(lists,s))
  }

}

那么再次,解析器组合器在这里有点过度.你可以得到几乎相同的事情(但是使用数组而不是列表)更简单:

s.split("n{2,}").map(_.split("n"))

(编辑:李大同)

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

    推荐文章
      热点阅读