Разбор отступов с помощью FastParse - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь проанализировать язык с отступами с помощью FastParse, и я изо всех сил пытаюсь найти какие-либо ресурсы или информацию о нем.
Существует только один пример, который я могу найти здесь , который показывает, как анализироватьи вычислить сумму целых чисел в древовидной структуре.Я попытался скопировать этот код, но я получаю ту же ошибку, когда он не может выполнить синтаксический анализ \n.

Я бы хотел разобрать это.

example
  1
  2
  3

Код

import fastparse.all._

class ExampleParser(indent: Int) {

  val word: P[String] = P("example".!)

  val number: P[String] = P( CharIn('0'to'9').rep(1).! )

  val blockBody: P[Seq[String]] = "\n" ~ deeper.flatMap(i => new ExampleParser(indent = i).number.rep(1, sep = ("\n" + " " * i).~/))

  val deeper: P[Int] = P(" ".rep(indent + 1).!.map(_.length))

  val section: P[(String, Seq[String])] = P(word ~ blockBody)

  val expr: P[(String, Seq[String])] = P(section)

}

object Main
{
  def main(args: Array[String]) =
  {
    check(
      """example
        |  1
        |  2
        |  3
      """.stripMargin.trim

    )
    println()
  }

  def check(str: String) = {
    new ExampleParser(0).expr.parse(str) match {
      case Parsed.Success(value, _) => println(value)
      case Parsed.Failure(a, b, c) => println("Failure:" + a + ":" + b + ":" + c)
    }
  }
}

Вывод

Failure:"\n":7:Extra(...ample
1
2
3, [traced - not evaluated])

Как правильно разобрать это?

1 Ответ

0 голосов
/ 12 июня 2018

Если я заменю «выражение» на «пример»:

check (
  """example
    |  1
    |  2
    |  3
  """.stripMargin.trim
)

Я получу результат:

[info] Running Main 
(example,ArrayBuffer(1, 2, 3))

Конечно, вы можете изменить его наоборот.

...