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