4

def我知道和val和一般之间的区别lazy val,但我不确定它们对解析器组合器的影响。我见过的所有例子都包含这样的代码:

def statement: Parser[Statement] =
  ifStatement |
  whileStatement |
  expressionStatement | ...

从我所做的一些实验来看,它似乎vallazy val能正常工作,但我不确定是否存在它们不再工作的情况,比如递归或定位解析器等等。

请赐教!

4

1 回答 1

2

如果您查看api 文档,解析器构建方法和运算符是使用按名称参数实现的,然后使用lazy val.

话虽如此,您仍然必须注意初始化的顺序。以下代码将导致空引用异常:

val as = a.*
val a = "a"

然而,以下是好的(因为参数~是按名称):

val as = "a" ~ a.*
val a = "a"

lazy一切都放在前面会“有帮助”,但会很吵。性能应该不是什么大问题,因为通常您只想初始化语法一次。def表达式将为引用它们的每个点初始化一次。

您可以稍微聪明一点,并使用块语法消除“次要”作品的管道:

lazy val addExpr = {
  val add = expr ~ "+" ~ expr
  val sub = expr ~ "-" ~ expr
  add | sub
}
于 2013-10-05T18:26:04.393 回答