2016-08-14 11 views
0

私はscala高速解析ライブラリを学習しようとしています。これに向けて、私は次のコードScala FastParseライブラリエラー

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 ..."" 

エラーを取得する私の予想出力が "バー(10)、バズ(20)" でした。上のパーサは、 ")"のように終わりがないようです。

答えて

3

AnyChar.rep(1)も入力文字列の末尾に)シンボルを含んでいるため、末尾に)があり、~ ")")に達しません。 )シンボルは、バーやバズで使用されていなかった 場合、これは、このようAnyCharから)を除くことによって解決することができます

val parser = P("Foo" ~ "(" ~ (!")" ~ AnyChar).rep(1).! ~ ")") 
val input1 = "Foo(Bar(10*, Baz(20*)" 

はバーとバズはあなたがそれぞれに別々のパーサを定義することができ)シンボルで動作させるには彼らは(もAnyCharから)シンボルを除く。それはバーやバズのより多く出現することができますが、私はあなたのアイデアを得ることを期待していて、次のソリューションは、もう少し柔軟性がある。

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)) 

RESU lt:
Success: Bar(10), Baz(20) 21

関連する問題