2012-01-30 11 views
6

में पारसी मॉड्यूल नहीं मिल रहा है मैं प्रश्न 67A of 99 Haskell Questions पर काम कर रहा हूं। सवाल एक दिया स्ट्रिंग से एक पेड़ निर्माण कर रही है: "x(y,a(,b))" => Branch 'x' (Branch 'y' Empty Empty) (Branch 'a' Empty (Branch 'b' Empty Empty))
एक समाधान Parsec का उपयोग कर के रूप में नीचे है:जीएचसीआई

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) 

लेकिन, मेरा GHCi न पा सके Text.Parsec.String है और न ही Text.Parsec। क्या वे मॉड्यूल अप्रचलित हैं? मेरे GHCi संस्करण 6.12.3

उत्तर

8

Text.Parsec और Text.Parsec.String संस्करण 3 से parsec पैकेज में मॉड्यूल हैं। पुराने parsec-2 इंटरफ़ेस पारंपरिक नाम Text.ParserCombinators.Parsec.* के साथ संगतता मॉड्यूल से उपलब्ध है, लेकिन *.String मॉड्यूल नहीं है, यह parsec-3 में नया है। यदि आपके पास parsec-2 या parsec सभी इंस्टॉल किए गए हैं, तो मैं कैननिकल cabal install parsec के साथ parsec-3 इंस्टॉल करने की अनुशंसा करता हूं।

संपादित करें:

आप पेड़ों के लिए एक कम कठोर वाक्य रचना पार्स करने के लिए, अपने उदाहरण इनपुट का समर्थन चाहते हैं, दो खाली बच्चों को

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

चूक पत्र एक आरंभिक कोष्ठक के बाद नहीं है, तो ।

+0

thx, यह parsec-3 स्थापित करने के बाद ठीक है। हालांकि, एक 'अप्रत्याशित "," उम्मीद "(" अब इसे चलाने पर अपवाद है। – manuzhang

+0

इनपुट "x (y, a (, b))" दिए गए पार्सर द्वारा पार्स नहीं किया जा सकता है, जो कठोर प्रारूप की मांग करता है " एक्स (वाई (,), ए (, बी (,)) "एक पेड़ के लिए। –

+0

thx फिर से और मैं हास्केल के 99 प्रश्नों पर अपना समाधान पोस्ट करता हूं। क्या यह ठीक है? अगर नहीं, तो मैं इसे तुरंत हटा दूंगा – manuzhang

0

ParsecText.ParserCombinators.Parsec बजाय Text.Parsec के तहत पाया जाता है।

संबंधित मुद्दे