diff --git a/src/Language/Preprocessor/Unlit.hs b/src/Language/Preprocessor/Unlit.hs index 1e843b1e..6e52a667 100644 --- a/src/Language/Preprocessor/Unlit.hs +++ b/src/Language/Preprocessor/Unlit.hs @@ -14,17 +14,17 @@ classify [] = [] classify (('\\':x):xs) | x == "begin{code}" = Blank : allProg xs where allProg [] = [] -- Should give an error message, -- but I have no good position information. - allProg (('\\':x):xs) | "end{code}"`isPrefixOf`x = Blank : classify xs - allProg (x:xs) = Program x:allProg xs -classify (('>':x):xs) = Program (' ':x) : classify xs + allProg (('\\':y):ys) | "end{code}" `isPrefixOf` y = Blank : classify ys + allProg (y:ys) = Program y : allProg ys +classify (('>':x):xs) = Program (' ' : x) : classify xs classify (('#':x):xs) = (case words x of (line:rest) | all isDigit line -> Include (read line) (unwords rest) _ -> Pre x ) : classify xs --classify (x:xs) | "{-# LINE" `isPrefixOf` x = Program x: classify xs -classify (x:xs) | all isSpace x = Blank:classify xs -classify (x:xs) = Comment:classify xs +classify (x:xs) | all isSpace x = Blank : classify xs +classify (_:xs) = Comment : classify xs unclassify :: Classified -> String unclassify (Program s) = s @@ -43,16 +43,16 @@ unlit file lhs = (unlines adjacent :: FilePath -> Int -> Classified -> [Classified] -> [Classified] adjacent file 0 _ (x :xs) = x : adjacent file 1 x xs -- force evaluation of line number -adjacent file n y@(Program _) (x@Comment :xs) = error (message file n "program" "comment") -adjacent file n y@(Program _) (x@(Include i f):xs) = x: adjacent f i y xs +adjacent file n (Program _) (Comment :_ ) = error (message file n "program" "comment") +adjacent _ _ y@(Program _) (x@(Include i f):xs) = x: adjacent f i y xs adjacent file n y@(Program _) (x@(Pre _) :xs) = x: adjacent file (n+1) y xs -adjacent file n y@Comment (x@(Program _) :xs) = error (message file n "comment" "program") -adjacent file n y@Comment (x@(Include i f):xs) = x: adjacent f i y xs +adjacent file n Comment ( (Program _) :_ ) = error (message file n "comment" "program") +adjacent _ _ y@Comment (x@(Include i f):xs) = x: adjacent f i y xs adjacent file n y@Comment (x@(Pre _) :xs) = x: adjacent file (n+1) y xs -adjacent file n y@Blank (x@(Include i f):xs) = x: adjacent f i y xs +adjacent _ _ y@Blank (x@(Include i f):xs) = x: adjacent f i y xs adjacent file n y@Blank (x@(Pre _) :xs) = x: adjacent file (n+1) y xs -adjacent file n _ (x@next :xs) = x: adjacent file (n+1) x xs -adjacent file n _ [] = [] +adjacent file n _ (x :xs) = x: adjacent file (n+1) x xs +adjacent _ _ _ [] = [] message :: String -> Int -> String -> String -> String message "\"\"" n p c = "Line "++show n++": "++p++ " line before "++c++" line.\n" @@ -63,7 +63,7 @@ message file n p c = "In file " ++ file ++ " at line "++show n++": "++p++ " li -- Re-implementation of 'lines', for better efficiency (but decreased laziness). -- Also, importantly, accepts non-standard DOS and Mac line ending characters. inlines :: String -> [String] -inlines s = lines' s id +inlines = (`lines'` id) where lines' [] acc = [acc []] lines' ('\^M':'\n':s) acc = acc [] : lines' s id -- DOS