我正在尝试从 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

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

最佳答案

Parboiled 2 的 rule 是一个宏,使用 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,您可以使用其他 delivery schemes 之一。

关于scala - Parboiled2 解析器示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29223741/

10-10 18:15