CSPM-Frontend-0.2.8.0: src/Language/CSPM/Utils.hs
-----------------------------------------------------------------------------
-- |
-- Module : Language.CSPM.Utils
-- Copyright : (c) Fontaine 2008
-- License : BSD
--
-- Maintainer : fontaine@cs.uni-duesseldorf.de
-- Stability : experimental
-- Portability : GHC-only
--
-- Some Utilities
module Language.CSPM.Utils
(eitherToExc
,handleLexError
,handleParseError
,handleRenameError
,parseFile,testFrontend)
where
import Language.CSPM.Parser (ParseError(..),parse)
import Language.CSPM.Rename (RenameError(..),getRenaming,applyRenaming)
import Language.CSPM.PatternCompiler (compilePattern)
import Language.CSPM.Token (Token,LexError(..))
import Language.CSPM.AST (Labeled(..),LModule,Module(..),Bindings)
import Language.CSPM.AstUtils
(removeSourceLocations,removeModuleTokens,removeParens,relabelAst
,unUniqueIdent,showAst,computeFreeNames)
import qualified Language.CSPM.LexHelper as Lexer
(lexInclude,lexPlain,filterIgnoredToken)
import Control.Exception as Exception
import System.CPUTime
-- | "eitherToExe" returns the Right part of "Either" or throws the Left part as an dynamic exception.
eitherToExc :: Exception a => Either a b -> IO b
eitherToExc (Right r) = return r
eitherToExc (Left e) = throw e
-- | Handle a dymanic exception of type "LexError".
handleLexError :: (LexError -> IO a) -> IO a -> IO a
handleLexError handler proc = Exception.catch proc handler
-- | Handle a dymanic exception of type "ParseError".
handleParseError :: (ParseError -> IO a) -> IO a -> IO a
handleParseError handler proc = Exception.catch proc handler
-- | Handle a dymanic exception of type "RenameError".
handleRenameError :: (RenameError -> IO a) -> IO a -> IO a
handleRenameError handler proc = Exception.catch proc handler
-- | Lex and parse a file and return a "LModule", throw an exception in case of an error
parseFile :: FilePath -> IO LModule
parseFile fileName = do
src <- readFile fileName
tokenList <- Lexer.lexInclude src >>= eitherToExc
eitherToExc $ parse fileName tokenList
testFrontend :: FilePath -> IO (LModule,LModule)
testFrontend fileName = do
src <- readFile fileName
putStrLn $ "Reading File " ++ fileName
startTime <- (return $ length src) >> getCPUTime
tokenList <- Lexer.lexInclude src >>= eitherToExc
time_have_tokens <- getCPUTime
ast <- eitherToExc $ parse fileName tokenList
time_have_ast <- getCPUTime
renaming <- eitherToExc $ getRenaming ast
let astNew = applyRenaming renaming ast
time_have_renaming <- getCPUTime
putStrLn $ "Parsing OK"
putStrLn $ "lextime : " ++ showTime (time_have_tokens - startTime)
putStrLn $ "parsetime : " ++ showTime(time_have_ast - time_have_tokens)
putStrLn $ "renamingtime : " ++ showTime (time_have_renaming - time_have_ast)
putStrLn $ "total : " ++ showTime(time_have_ast - startTime)
return (ast,astNew)
where
showTime :: Integer -> String
showTime a = show (div a 1000000000) ++ "ms"