リストが1つ以上の空白行で区切られている改行区切りの単語リストを読み取る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))
しかし、これは上記の入力にかかっています。
複数の空白行を区切り文字として処理する正しい文法は何ですか?