我正在尝试使用FastParse解析缩进语言,但我很难找到关于它的任何资源或信息。
我能找到的here示例只有一个,它展示了如何解析和计算树结构中整数的总和。我尝试复制这段代码,但在解析\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])我怎样才能正确地解析它呢?
发布于 2018-06-12 11:30:56
如果我将"expression“改为"example":
check (
"""example
| 1
| 2
| 3
""".stripMargin.trim
)我得到的结果是:
[info] Running Main
(example,ArrayBuffer(1, 2, 3))当然,您可能希望以相反的方式更改它。
https://stackoverflow.com/questions/50805829
复制相似问题