2011-07-17 16 views
5

Estoy usando parboiled para escribir un analizador. Definí algunos métodos como:Cómo combinar estos tres métodos en uno

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) } 

Pueden ver que son muy similares. Quiero combinarlos en uno, pero no sé cómo hacerlo. Tal vez debería ser:

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

Respuesta

6

La versión vararg puede implementarse como:

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

Sin embargo, yo no uso sancochado así que no puedo probarlo.

+0

¡es correcto, gracias! – Freewind

Cuestiones relacionadas