def
我知道和val
和一般之间的区别lazy val
,但我不确定它们对解析器组合器的影响。我见过的所有例子都包含这样的代码:
def statement: Parser[Statement] =
ifStatement |
whileStatement |
expressionStatement | ...
从我所做的一些实验来看,它似乎val
也lazy val
能正常工作,但我不确定是否存在它们不再工作的情况,比如递归或定位解析器等等。
请赐教!
def
我知道和val
和一般之间的区别lazy val
,但我不确定它们对解析器组合器的影响。我见过的所有例子都包含这样的代码:
def statement: Parser[Statement] =
ifStatement |
whileStatement |
expressionStatement | ...
从我所做的一些实验来看,它似乎val
也lazy val
能正常工作,但我不确定是否存在它们不再工作的情况,比如递归或定位解析器等等。
请赐教!
如果您查看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
}