ddc-driver-0.4.3.1: DDC/Driver/Command/Scan.hs
module DDC.Driver.Command.Scan
( cmdScanFromFile)
where
import DDC.Driver.Stage
import DDC.Source.Tetra.Lexer as ST
import Control.Monad.Trans.Except
import Control.Monad.IO.Class
import System.Directory
import Control.Monad
import qualified DDC.Data.SourcePos as SP
-------------------------------------------------------------------------------
-- | Scan a module.
-- Any errors are thrown in the `ExceptT` monad.
cmdScanFromFile
:: Config -- ^ Driver config.
-> FilePath -- ^ Module file name.
-> Bool -- ^ Whether to print source locations.
-> ExceptT String IO ()
cmdScanFromFile _config filePath bPrintLocs
= do
-- Check that the file exists.
exists <- liftIO $ doesFileExist filePath
when (not exists)
$ throwE $ "No such file " ++ show filePath
-- Read in the source file.
src <- liftIO $ readFile filePath
-- Lex the source string.
let toks = ST.lexModuleString filePath 1 src
if bPrintLocs
then liftIO $ putStr $ unlines $ map show toks
else liftIO $ putStr $ unlines $ map show $ map SP.valueOfLocated toks