2012-01-30 7 views
6

He estado trabajando en la pregunta 67A of 99 Haskell Questions. La cuestión es la construcción de un árbol de una cadena dada: "x(y,a(,b))" => Branch 'x' (Branch 'y' Empty Empty) (Branch 'a' Empty (Branch 'b' Empty Empty))
Una solución utilizando Parsec es la siguiente:no se pueden encontrar módulos de Parsec en GHCi

import Text.Parsec.String 
import Text.Parsec hiding (Empty) 

pTree :: Parser (Tree Char) 
pTree = do 
    pBranch <|> pEmpty 

pBranch = do 
    a <- letter 
    char '(' 
    t0 <- pTree 
    char ',' 
    t1 <- pTree 
    char ')' 
    return $ Branch a t0 t1 

pEmpty = 
    return Empty 

stringToTree str = 
    case parse pTree "" str of 
    Right t -> t 
    Left e -> error (show e) 

Sin embargo, mi GHCi podía ni encontrar ni Text.Parsec.StringText.Parsec. ¿Están esos módulos obsoletos? Mi versión es GHCi 6.12.3

Respuesta

8

Text.Parsec y Text.Parsec.String son módulos en el paquete parsec de la versión 3 en adelante. La antigua interfaz parsec-2 está disponible en los módulos de compatibilidad con los nombres tradicionales Text.ParserCombinators.Parsec.*, pero no hay ningún módulo *.String, que es nuevo en parsec-3. Si tiene parsec-2 o no parsec instalados, recomiendo instalar parsec-3 con el canónico cabal install parsec.

Editar:

Si desea analizar una sintaxis menos rígida de los árboles, el apoyo a su entrada ejemplo,

pBranch = do 
    a <- letter 
    do char '(' 
    t0 <- pTree 
    char ',' 
    t1 <- pTree 
    char ')' 
    return $ Branch a t0 t1 
    <|> return (Branch a Empty Empty) 

por defecto a dos niños vacíos si la carta no es seguido por un paréntesis de apertura .

+0

thx, está compilado bien después de instalar parsec-3. Sin embargo, hay una excepción "inesperada", "esperando" ("' cuando se ejecuta ahora. – manuzhang

+0

La entrada "x (y, a (, b))" no puede ser analizada por el analizador dado, que exige el formato rígido " x (y (,), a (, b (,))) para ese árbol –

+0

thx de nuevo y publico tu solución en 99 preguntas de Haskell. ¿De acuerdo? Si no, lo eliminaré inmediatamente – manuzhang

0

Parsec se encuentra bajo Text.ParserCombinators.Parsec en lugar de Text.Parsec.

Cuestiones relacionadas