import Lexer import Layout import System import List import IO import Unlit trans fname xs = f 0 xs where f n rs@(L (AlexPn _ l cp) _ _:_) | n /= l = (if l == n + 1 then (Token "\n":) else (Token ("{-# LINE " ++ show l ++ " " ++ show fname ++ " #-}"):)) $ TokenNL cp:f l rs f n (L _ c s:rs@(L _ _ "{":_)) | s `elem` layoutStarters = Token s:f n rs f n (L _ c s:rs@(L (AlexPn _ _ cp) _ _:_)) | s `elem` layoutStarters = Token s:TokenVLCurly s cp:f n rs f n (L _ c s:rs) = Token s:f n rs f _ [] = [] layoutStarters = ["where","let","of","do"] showT (TokenVLCurly _ n) = "{" ++ show n showT (TokenNL n) = "\n(" ++ show n ++ ")" showT (Token ('{':'-':s)) = '\n':'{':'-':s ++ "\n" showT (Token s) = s readHsFile rfn fn | "shl." `isPrefixOf` reverse fn = unlit rfn `fmap` readFile fn | otherwise = readFile fn main = do as <- getArgs case as of [ofilename,infile,outfile] -> do hPutStrLn stderr $ "getlaid " ++ ofilename ++ ": " ++ infile ++ " -> " ++ outfile s <- readHsFile ofilename infile if "-- dontlay" `isPrefixOf` s then writeFile outfile s else writeFile outfile (f ofilename s) [infile] -> do s <- readHsFile infile infile putStr (f infile s) _ -> do s <- getContents putStr (f "(unknown)" s) f fname s = let ts = case scanner s of Right ss@(L _ LReservedId "module":_) -> trans fname ss Right ss@(L (AlexPn _ _ cp) _ _:_) -> mainHeader ++ TokenVLCurly "where" cp:trans fname ss Left s -> error $ "error parsing file: " ++ show s x -> error (show x) in (unwords $ map showT (layout ts [])) ++ "\n" mainHeader = [TokenNL 1,Token "module",Token "Main",Token "(",Token "main",Token ")",Token "where"]