Scala FastParse 库错误
Scala FastParse Library Error
我正在尝试学习 scala 快速解析库。为此,我编写了以下代码
import fastparse.noApi._
import fastparse.WhitespaceApi
object FastParsePOC {
val White = WhitespaceApi.Wrapper{
import fastparse.all._
NoTrace(" ".rep)
}
def print(input : Parsed[String]): Unit = {
input match {
case Parsed.Success(value, index) => println(s"Success: $value $index")
case f @ Parsed.Failure(error, line, col) => println(s"Error: $error $line $col ${f.extra.traced.trace}")
}
}
def main(args: Array[String]) : Unit = {
import White._
val parser = P("Foo" ~ "(" ~ AnyChar.rep(1).! ~ ")")
val input1 = "Foo(Bar(10), Baz(20))"
print(parser.parse(input1))
}
}
但是我得到错误
Error: ")" 21 Extra(Foo(Bar(10), Baz(20)), [traced - not evaluated]) parser:1:1 / (AnyChar | ")"):1:21 ...""
我的预期输出是 "Bar(10), Baz(20)"。上面的解析器似乎不喜欢结尾“)”。
AnyChar.rep(1)
还在输入字符串的末尾包含 )
符号,因此未到达 ~ ")")
处的末尾 )
。
如果 )
符号没有在 Bar 和 Baz 中使用,那么这可以通过从 AnyChar
中排除 )
来解决,如下所示:
val parser = P("Foo" ~ "(" ~ (!")" ~ AnyChar).rep(1).! ~ ")")
val input1 = "Foo(Bar(10*, Baz(20*)"
要使 Bar 和 Baz 与 )
符号一起工作,您可以为它们中的每一个定义单独的解析器(也排除 AnyChar
中的 )
符号)。以下解决方案有点多灵活,因为它允许出现更多的 Bar 和 Baz,但我希望你能理解。
val bar = P("Bar" ~ "(" ~ (!")" ~ AnyChar).rep(1) ~ ")")
val baz = P("Baz" ~ "(" ~ (!")" ~ AnyChar).rep(1) ~ ")")
val parser = P("Foo" ~ "(" ~ (bar | baz).rep(sep = ",").! ~ ")")
val input1 = "Foo(Bar(10), Baz(20))"
print(parser.parse(input1))
结果:
Success: Bar(10), Baz(20) 21
我正在尝试学习 scala 快速解析库。为此,我编写了以下代码
import fastparse.noApi._
import fastparse.WhitespaceApi
object FastParsePOC {
val White = WhitespaceApi.Wrapper{
import fastparse.all._
NoTrace(" ".rep)
}
def print(input : Parsed[String]): Unit = {
input match {
case Parsed.Success(value, index) => println(s"Success: $value $index")
case f @ Parsed.Failure(error, line, col) => println(s"Error: $error $line $col ${f.extra.traced.trace}")
}
}
def main(args: Array[String]) : Unit = {
import White._
val parser = P("Foo" ~ "(" ~ AnyChar.rep(1).! ~ ")")
val input1 = "Foo(Bar(10), Baz(20))"
print(parser.parse(input1))
}
}
但是我得到错误
Error: ")" 21 Extra(Foo(Bar(10), Baz(20)), [traced - not evaluated]) parser:1:1 / (AnyChar | ")"):1:21 ...""
我的预期输出是 "Bar(10), Baz(20)"。上面的解析器似乎不喜欢结尾“)”。
AnyChar.rep(1)
还在输入字符串的末尾包含 )
符号,因此未到达 ~ ")")
处的末尾 )
。
如果 )
符号没有在 Bar 和 Baz 中使用,那么这可以通过从 AnyChar
中排除 )
来解决,如下所示:
val parser = P("Foo" ~ "(" ~ (!")" ~ AnyChar).rep(1).! ~ ")")
val input1 = "Foo(Bar(10*, Baz(20*)"
要使 Bar 和 Baz 与 )
符号一起工作,您可以为它们中的每一个定义单独的解析器(也排除 AnyChar
中的 )
符号)。以下解决方案有点多灵活,因为它允许出现更多的 Bar 和 Baz,但我希望你能理解。
val bar = P("Bar" ~ "(" ~ (!")" ~ AnyChar).rep(1) ~ ")")
val baz = P("Baz" ~ "(" ~ (!")" ~ AnyChar).rep(1) ~ ")")
val parser = P("Foo" ~ "(" ~ (bar | baz).rep(sep = ",").! ~ ")")
val input1 = "Foo(Bar(10), Baz(20))"
print(parser.parse(input1))
结果:
Success: Bar(10), Baz(20) 21