我與Haskell的初學者,所以它可能是很明顯的,我做錯了什麼......想不通負前瞻與秒差距
雖然試圖解析"1:1,2, 2:18, 3:100"
到[(1,1), (1,2), (2,18), (3,100)]
我被困在一個超前。
要知道一個數字是否是一個經文編號,它應該向前看一個冒號,因爲它是一個章節號碼。
問題在於最後一個函數verseNr
,如果沒有冒號後面的話,它應該解析+使用該數字,否則失敗而不消耗任何東西(將數字作爲章節號碼解析爲refGroupByChapter
)。
除了這個問題似乎很好地工作:)
import Text.ParserCombinators.Parsec
main = do
case (parse refString "(unknown)" "1:1,2, 2:18, 3:100") of
Left e -> do putStr "parse error at "; print e
Right x -> print x -- expecting: [(1,1), (1,2), (2,18), (3,100)]
refString :: GenParser Char st [(Int, Int)]
refString = do
refGroups <- many refGroupByChapter
eof
return $ concat $ map flatten refGroups
where flatten (_, []) = []
flatten (c, v:vs) = (c, v):(flatten (c, vs))
refGroupByChapter :: GenParser Char st (Int, [Int])
refGroupByChapter = do
chapterNum <- many digit
char ':'
verseNums <- verseNrs
return ((read chapterNum :: Int), verseNums)
verseNrs :: GenParser Char st [Int]
verseNrs = do
first <- verseNr
remaining <- remainingVerseNrs
return (first:remaining)
where
remainingVerseNrs = do -- allow for spaces around the commas
(spaces >> oneOf "," >> spaces >> verseNrs) <|> (return [])
verseNr = try $ do
n <- many1 digit
notFollowedBy $ char ':' -- if followed by a ':' it's a chapter number
return (read n :: Int)
非常感謝..它工作得很好,你的風格的評論也發現了我的代碼。 – cies