3

私はparboiled2からこの例を試してみようとしています:

scala> class MyParser(val input: org.parboiled2.ParserInput) 
            extends org.parboiled2.Parser { 
                def f = rule { capture("foo" ~ push(42)) 
                } 
        }
defined class MyParser

MyParser次に、の入力で新規作成します"foo"

scala> new MyParser("foo").f
res11: org.parboiled2.Rule[shapeless.HNil,shapeless.::
            [Int,shapeless.::[String,shapeless.HNil]]] = null

それでも戻り値はnullです。

f この単純なルールを REPL から実行するにはどうすればよいですか?

4

1 に答える 1

7

パーボイルド 2ruleはマクロであり、 を使用して定義されたメソッドはrule、他のルールのコンテキストまたは への呼び出しの外部で参照されることを意図していませんrun()。したがって、次の場合:

import org.parboiled2._

class MyParser(val input: ParserInput) extends Parser {
  def f = rule { capture("foo" ~ push(42)) } 
}

次のように使用できます (わかりやすくするために型をクリーンアップします)。

scala>  new MyParser("foo").f.run()
res0: scala.util.Try[Int :: String :: HNil] = Success(42 :: foo :: HNil)

が必要ない場合Tryは、他の配信スキームのいずれかを使用できます。

于 2015-03-24T02:13:48.293 に答える