2010-10-13 9 views
5

Lo siento si es una cuestión novato - Quiero analizar algo definido por¿Cómo recuperar el valor del analizador opcional en Parsec?

Exp :: = Mandatory_Part Optional_Part0 Optional_Part1

I pensé que podía hacer esto:

proc::Parser String 

proc = do { 

    ;str<-parserMandatoryPart 

    ;str0<-optional(parserOptionalPart0) --(1) 

    ;str1<-optional(parserOptionalPart1) --(2) 

    ;return str++str0++str1 

} 

quiero obtener str0/str1 si hay piezas opcionales, de lo contrario, str0/str1 sería "". Pero (1) y (2) no funcionarán porque opcional() no permite extraer el resultado de sus parámetros, en este caso, parserOptionalPart0/parserOptionalPart1.

Ahora ¿Cuál sería la adecuada manera de hacerlo?

¡Muchas gracias!

Billy R

Respuesta

6

La función que está buscando es optionMaybe. Devuelve Nothing si el analizador falló y devuelve el contenido en Just si consumió la entrada.

+1

Gracias Paul. Esto funcionó para mí. –

+1

Simplemente funciona. X7D – dmvianna

4

De the docs:

option x p trata de aplicar analizador p. Si p falla sin consumir datos de entrada, devuelve el valor x, de lo contrario, el valor devuelto por p.

por lo que podría hacer:

proc :: Parser String 
proc = do 
    str <- parserMandatoryPart 
    str0 <- option "" parserOptionalPart0 
    str1 <- option "" parserOptionalPart1 
    return (str++str0++str1) 

Cuidado con la parte "sin consumir entrada". Es posible que deba ajustar uno o ambos analizadores opcionales con try.

También he ajustado el estilo del código para que sea más estándar, y he corregido un error en la última línea. return no es una palabra clave; es una función ordinaria. Por lo tanto, return a ++ b es (return a) ++ b, es decir, casi nunca lo que desea.

+0

Keegan, gracias por la respuesta y la corrección de mi código. Funcionó principalmente como yo quería, hay algunos problemas con casos no descritos en la publicación original. Soy nuevo en Haskell & Parsec, solo leeré e intentaré más. Gracias. –

Cuestiones relacionadas