首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala FastParse库错误

Scala FastParse库错误
EN

Stack Overflow用户
提问于 2016-08-14 04:11:19
回答 1查看 258关注 0票数 1

我正在努力学习scala快速解析库。为此,我编写了以下代码

代码语言:javascript
复制
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))
   }
}

但我错了

代码语言:javascript
复制
Error: ")" 21 Extra(Foo(Bar(10), Baz(20)), [traced - not evaluated]) parser:1:1 / (AnyChar | ")"):1:21 ...""

我的预期产出是"Bar(10),Baz(20)“。上面的解析器似乎不喜欢结尾")“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-14 07:48:15

AnyChar.rep(1)还在输入字符串的末尾包含)符号,因此无法到达~ ")")处的end )。如果在Bar和Baz中没有使用)符号,那么可以通过将)AnyChar中排除出来来解决这个问题:

代码语言:javascript
复制
val parser = P("Foo" ~ "(" ~ (!")" ~ AnyChar).rep(1).! ~ ")")
val input1 = "Foo(Bar(10*, Baz(20*)"

要使Bar和Baz与)符号一起工作,您可以为每个解析器定义单独的解析器(也可以从AnyChar中排除)符号)。下面的解决方案更灵活一些,因为它允许更多的Bar和Baz出现,但是我希望您能理解这个想法。

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38939047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档