Как объединить эти три метода в один - PullRequest
5 голосов
/ 17 июля 2011

Я использую parboiled для написания парсера.Я определил некоторые методы как:

def InlineCharsBefore(sep: String) 
    = rule { zeroOrMore(!str(sep) ~ InlineChar) }
def InlineCharsBefore(sep1: String, sep2: String) 
    = rule { zeroOrMore((!str(sep1) | !str(sep2)) ~ InlineChar) }
def InlineCharsBefore(sep1: String, sep2: String, sep3: String) 
    = rule { zeroOrMore((!str(sep1) | !str(sep2) | !str(sep3)) ~ InlineChar) }

Вы можете видеть, что они очень похожи.Я хочу объединить их в одно, но я не знаю, как это сделать.Может быть, это должно быть:

def InlineCharsBefore(seps: String*) = rule { ??? }

1 Ответ

6 голосов
/ 17 июля 2011

Версия vararg может быть реализована как:

 def InlineCharsBefore( seps: String* ) = {
   val sepMatch = seps.map( s => ! str(s) ).reduceLeft( _ | _ )
   rule { zeroOrMore( sepMatch ~ InlineChar) }
 }

Однако я не использую пропаренный , поэтому я не могу его проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...