mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-11 05:49:31 -06:00
53 lines
1.7 KiB
Haskell
53 lines
1.7 KiB
Haskell
----------------------------------------------------------------------
|
|
-- |
|
|
-- Module : GetGrammar
|
|
-- Maintainer : AR
|
|
-- Stability : (stable)
|
|
-- Portability : (portable)
|
|
--
|
|
-- > CVS $Date: 2005/11/15 17:56:13 $
|
|
-- > CVS $Author: aarne $
|
|
-- > CVS $Revision: 1.16 $
|
|
--
|
|
-- this module builds the internal GF grammar that is sent to the type checker
|
|
-----------------------------------------------------------------------------
|
|
|
|
module GF.Compile.GetGrammar (getSourceModule, addOptionsToModule) where
|
|
|
|
import GF.Data.Operations
|
|
|
|
import GF.Infra.UseIO
|
|
import GF.Infra.Modules
|
|
import GF.Infra.Option
|
|
import GF.Grammar.Lexer
|
|
import GF.Grammar.Parser
|
|
import GF.Grammar.Grammar
|
|
|
|
import GF.Compile.ReadFiles
|
|
|
|
import Data.Char (toUpper)
|
|
import Data.List (nub)
|
|
import qualified Data.ByteString.Char8 as BS
|
|
import Control.Monad (foldM)
|
|
import System.Cmd (system)
|
|
|
|
getSourceModule :: Options -> FilePath -> IOE SourceModule
|
|
getSourceModule opts file0 = ioe $
|
|
catch (do file <- foldM runPreprocessor file0 (flag optPreprocessors opts)
|
|
content <- BS.readFile file
|
|
case runP pModDef content of
|
|
Left (Pn l c,msg) -> return (Bad (file++":"++show l++":"++show c++": "++msg))
|
|
Right mo -> return (Ok (addOptionsToModule opts mo)))
|
|
(\e -> return (Bad (show e)))
|
|
|
|
addOptionsToModule :: Options -> SourceModule -> SourceModule
|
|
addOptionsToModule opts = mapSourceModule (\m -> m { flags = flags m `addOptions` opts })
|
|
|
|
-- FIXME: should use System.IO.openTempFile
|
|
runPreprocessor :: FilePath -> String -> IO FilePath
|
|
runPreprocessor file0 p = do
|
|
let tmp = "_gf_preproc.tmp"
|
|
cmd = p +++ file0 ++ ">" ++ tmp
|
|
system cmd
|
|
return tmp
|