使用parsec解析数据列

时间:2015-08-09 17:31:25

标签: parsing haskell parsec

我正在编写一个解析器来扫描数字列。像这样:

T   LIST2   LIST3   LIST4
1   235 623 684
2   871 699 557
3   918 686 49
4   53  564 906
5   246 344 501
6   929 138 474

第一行包含列表的名称,我希望我的程序能够解析与标题中完全相同数量的数据(以排除标题或列数不连贯的数组)。

我写了这个程序:

title = do
  tit <- many1 alphaNum
  return tit

digits = do
  dig <- many1 digit
  return dig

parseSeries = do 
    spaces
    titles <- title `sepBy` spaces
    let nb = length titles
    dat <- endBy (count (nb-1) (digits `sepBy` spaces)) endOfLine
    spaces
    return (titles,concat dat)

main = do
    fichier <- readFile ("test_list3.txt")
    putStrLn $ fichier
    case parse parseSeries "(stdin)" fichier of
            Left error -> do putStrLn "!!! Error !!!"
                             print error
            Right (tit,resu) -> do  
                                mapM_ putStrLn  tit
                                mapM_ putStrLn  (concat  resu)

但是当我尝试用这种数据解析文件时,我有以下错误:

!!! Error !!!
"(stdin)" (line 26, column 1):
unexpected end of input
expecting space or letter or digit

我是解析新手,我不明白为什么会失败?

您是否知道我的解析器出了什么问题?

1 个答案:

答案 0 :(得分:1)

您的计划正在做与您期望的不同的事情。关键部分就在这里:

@Override
protected void mouseClicked(MouseEvent e)
{
    for (Rectangle r: rectangles)
    {
        if (r.contains(e.getPoint())
           // do something
    }
}

我相信你真正想要的是:

parseSeries = do 
    spaces
    titles <- title `sepBy` spaces
    let nb = length titles

    -- The following is the incorrect part
    dat <- endBy (count (nb-1) (digits `sepBy` spaces)) endOfLine
    spaces
    return (titles,concat dat)