2013-06-07 4 views
5

テキストを解析しようとしていますが、区切り記号で区切られた記号のリストを解析する方法を理解できません。リストの最後に区切り文字があるリストを解析します。

例(スペースで区切られた数字):それは私がリストの後many whitespaceにも読み取ろうとしても、別の数字を予想しているため

set A = 1 2 3 4 5; 
set B =6 7 8 9; 
set C = 10 11 12 ; 

私はsepByを使用している場合は、最後のスペースの後に、私はエラーを得ました。 endByを使用すると、スペースがないときにエラーが発生します。

import Text.ParserCombinators.Parsec 

main :: IO() 
main = do 
    let input = "set A = 1 2 3 4 5;\n" ++ 
       "set B =6 7 8 9;\n" ++ 
       "set C = 10 11 12 ;\n" 
    case parse parseInput "(unknown)" input of 
    Left msg -> 
     print msg 
    Right rss -> 
     mapM_ (\(n, vs) -> putStrLn (n ++ " = " ++ show vs)) rss 

whitespace :: GenParser Char st Char 
whitespace = oneOf " \t" 

parseInput :: GenParser Char st [(String, [Int])] 
parseInput = parseRow `endBy` newline 

parseRow :: GenParser Char st (String, [Int]) 
parseRow = do 
    string "set" 
    many1 whitespace 
    name <- many1 alphaNum 
    many whitespace 
    string "=" 
    many whitespace 
    values <- many1 digit `sepBy` many1 whitespace 
    many whitespace 
    string ";" 
    return (name, map read values) 
+0

この前の質問http://stackoverflow.com/questions/3921559/haskell-parsec-optional-questionが役立つかもしれません。 – rickythesk8r

答えて

8

あなたが望むと思うコンビネータは​​です。それを使用すると、

-- I'm using the type synonym 
-- type Parser = GenParser Char() 
-- from Text.ParseCombinator.Parsec.Prim 
parseRow :: Parser (String, [Int]) 
parseRow = do 
    string "set" >> many1 whitespace 
    name <- many1 alphaNum 
    spaces >> char '=' >> spaces 
    values <- many1 digit `sepEndBy` many1 whitespace 
    char ';' 
    return (name, map read values) 
    where spaces = many whitespace 
関連する問題