Parboiled2 Parser示例

Kev*_*ith 3 parsing scala parboiled2

我试图从parboiled2尝试这个例子:

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

然后,我创建一个新MyParser的输入"foo".

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

但回报值是null.

如何从REPL 运行这个简单的f 规则

Tra*_*own 7

Parboiled 2 rule是一个宏,并且使用的rule方法不打算在其他规则或调用的上下文之外引用run().所以如果你有以下内容:

import org.parboiled2._

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

您可以像这样使用它(为清晰起见清理了类型):

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

如果您不想要,Try您可以使用其他交付方案之一.