gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:02:10 26 4
gpt4 key购买 nike

我正在编写一种 Scala 解析器组合器语法,用于读取换行符分隔的单词列表,其中列表由一个或多个空行分隔。给定以下字符串:

cat
mouse
horse

apple
orange
pear

我想让它返回List(List(cat, mouse, horse), List(apple, Orange, pear))

我编写了这个基本语法,它将单词列表视为换行符分隔的单词。请注意,我必须覆盖 whitespace 的默认定义。

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)

这可以处理列表之间只有一个空行的情况,但对于多个空行也有同样的问题。

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

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

但这取决于上面的输入。

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

最佳答案

您应该尝试设置skipWhitespacefalse 而不是重新定义空白的定义。您遇到的空列表问题是由 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"))

关于Scala 解析器组合器和换行符分隔的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13355238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com