Я бы немного разделил его и вставил анализ случая в |
. Это одно из преимуществ комбинаторов и действительно LL (*) парсинга в целом:
def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) }
| "(" ~> expr <~ ")"
| ident ^^ { Variable(_) } )
Я прошу прощения, если вы не знакомы с синтаксисом подчеркивания. По сути, это просто означает «подставить n -й параметр в значение функции включения». Таким образом, { Variable(_) }
эквивалентно { x => Variable(x) }
.
Еще одна магия синтаксиса здесь - это операторы ~>
и <~
вместо ~
. Эти операторы означают, что синтаксический анализ этого термина должен включать синтаксис обоих символов, но результат должен определяться исключительно результатом expr
. Таким образом, "(" ~> expr <~ ")"
соответствует точно так же, как и "(" ~ expr ~ ")"
, но для извлечения внутреннего значения результата из expr
.
не требуется дополнительный анализ случая