2
我正在尝试使用FastParse API实现以下语法。FastParse。如何强制执行一次规则
- expr可以仅含有富,酒吧,巴兹子表达式
- expr必须至少含有一个子表达的Foo /酒吧/酒吧。它不能为空
- Foo/Bar/Baz可以以任何顺序出现在Expr中。
- 富/酒吧/巴兹不能重复,所以你可以使用他们只有一次
因此,一个有效的表达式是Expr(Baz(10),Foo(10),Bar(10))
和无效的表达Expr()
或Expr(Bar(10),Bar(10))
到目前为止,我已经写了这个代码,可以强制执行并解析1,2,3,规则。但4号规则被证明是棘手的。
import fastparse.noApi._
import fastparse.WhitespaceApi
object FastParsePOC {
val White = WhitespaceApi.Wrapper{
import fastparse.all._
NoTrace(" ".rep)
}
def print(input: Parsed[(String, String, Seq[(String, String)])]) : Unit = {
input match {
case Parsed.Success(value, index) =>
println(s"${value._1} ${value._2}")
value._3.foreach{case (name, index) => println(s"$name $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 base = P("(" ~ (!")" ~ AnyChar).rep(1).! ~ ")")
val foo = P("Foo".! ~ base)
val bar = P("Bar".! ~ base)
val baz = P("Baz".! ~ base)
val foobarbaz = (foo | bar | baz)
val parser = P("Expr" ~ "(" ~ foobarbaz ~ ",".? ~ (foobarbaz).rep(sep=",") ~ ")")
val input3 = "Expr(Baz(20),Bar(10),Foo(30))"
val parsed = parser.parse(input3)
print(parsed)
}
}