我正在尝试编写一个递归解析器combinator类
import scala.util.parsing.combinator._
class MyParser extends RegexParsers {
override val skipWhitespace = true
val singleValue = "[\\p{L}][\\p{L}0-9_\\*]*".r
val expr : Parser[Any] = subExpr ~ rep("&" ~ subExpr | "|" ~ subExpr)
val subExpr : Parser[Any] = singleValue | "(" ~ expr ~ ")"
} 当我尝试实例化它时。它抛出空指针异常
val parser = new MyParser
java.lang.NullPointerException
ammonite.$sess.cmd8$MyParser.<init>(cmd8.sc:4)
ammonite.$sess.cmd9$.<init>(cmd9.sc:1)
ammonite.$sess.cmd9$.<clinit>(cmd9.sc)我真的不知所措。代码中绝对没有任何内容会在构造时导致空指针异常。不知道发生了什么
发布于 2019-09-18 12:52:10
MyParser的两个成员expr和subExpr必须在每次创建MyParser时进行初始化,但它们相互引用。它们按顺序求值,并且在求值expr时,subExpr仍设置为null。这个问题的一个简化版本是:
class Bad {
val one = two - 1
val two = one + 1
}您可能希望将expr和subExpr更改为方法(使用def),以便在需要时才检索它们。
https://stackoverflow.com/questions/57985260
复制相似问题