我正在编写一个解析器来扫描数字列。像这样:
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
我是解析新手,我不明白为什么会失败?
您是否知道我的解析器出了什么问题?
答案 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)