読者です 読者をやめる 読者になる 読者になる

パーサコンビネータの処理が終わってくれない!!

パーサコンビネータの勉強も兼ねて、ScalaでWikiエンジンを作ろうと思ってます。

パーサコンビネータでいろいろ試していますが、以下のコードは、私の環境では処理が終わってくれません。
なんでだろう・・・。

import scala.util.parsing.combinator.RegexParsers

case class Indent(i: Int)
case class Text(s: String)
case class Line(i: Indent, t: Text)

object Parser extends RegexParsers {

  def indent: Parser[Indent] = """^\s*""".r ^^ {in => Indent(in.length)}
  def text: Parser[Text] = """[^\n\r]*""".r ^^ {s => Text(s)}
  def eol = """\n?\r?""".r

  def line: Parser[Line] = indent ~ (text <~ eol) ^^ {case in ~ te => Line(in, te)}

  def parse(s: String) = parseAll(rep(line), s)
 
}

object Main extends App {
  val s = """  hoge\n  fuga"""
  
  // 自分の環境では、この処理は終わらない。
  // 戻り値は List(Line(Indent(2), Text(hoge)), Line(Indent(2), Text(fuga))) を想定しているが・・・
  Parser.parse(s)
}

とりあえずやりたいことは、

  • indent で行頭のスペースの数を取得したい
  • text で本文を取得したい
  • eof で行を区切る

なのですが、うまく処理が終わってくれません。