content: module ConvertLex where
  
  import System.Environment (getArgs)
  import System.Exit (exitFailure)
  import System.IO
  
  import Data.List 
  import Data.Char
  
  main = 
    do args <- getArgs 
       case args of
        [fname] ->    
          do file <- readFile fname
             let newName = "Abs" ++ (reverse $ takeWhile (/= '/') $ reverse fname)
             let rootName = reverse $ drop 3 $ takeWhile (/='/') $ reverse newName
             let absContent = unlines $ map (makeAbstract (\bf pos hd -> bf ++" fun " ++ hd ++ " : " ++ pos ++ " ; ")) (lines file)  
             let intContent = unlines $ map (makeAbstract (\bf pos hd -> bf ++ " lin " ++ hd ++ " = " ++ "mkSimpCat" ++ "\"" ++ hd ++ "\" ;")) (lines file)
             let absFile = "abstract " ++ rootName ++ " = AbsToAPI ** { \n\n" ++ absContent ++ "\n\n}"
             let intFile = "incomplete concrete " ++  rootName ++ "I of " ++ rootName ++ " = AbsToAPI ** {\n\n" ++ intContent ++ "\n\n}"
             let concAbs = "concrete " ++ rootName ++ "Abs of " ++ rootName ++ " =  AbsToAPIAbs, "++ rootName ++ "I ** {}"
             let concApi = "concrete " ++ rootName ++ "api of " ++ rootName ++ " =  AbsToAPIapi, "++ rootName ++ "I ** {}" 
             writeFile newName absFile
             putStrLn $ "Wrote file "++ newName
             writeFile (rootName ++ "I.gf") intFile 
             putStrLn $ "Wrote file " ++ rootName ++ "I.gf"
             writeFile (rootName ++ "Abs.gf") concAbs
             putStrLn $ "Wrote file " ++ rootName ++ "Abs.gf"
             writeFile (rootName ++ "api.gf") concApi
             putStrLn $ "Wrote file " ++ rootName ++ "api.gf"  
        _ -> error "usage ConvertLex file_name"
  
  
  makeAbstract :: (String -> String -> String -> String) -> String -> String
  makeAbstract fcs str = 
      let newss = dropWhile isSpace str
         in 
        if isInfixOf "=" newss && isInfixOf ";" newss then
             let hd = head $ words newss 
                 maybepos = dropWhile (/='_') hd
                 pos = if null maybepos then "??" else tail maybepos
                 bf = if null maybepos then "--" else ""
                     in
                     if isInfixOf "flags" newss && bf == "--" then ""
                          else fcs bf pos hd
          else ""
  
  