diff options
| author | hallgren <hallgren@chalmers.se> | 2013-11-21 16:27:26 +0000 |
|---|---|---|
| committer | hallgren <hallgren@chalmers.se> | 2013-11-21 16:27:26 +0000 |
| commit | 260c0dfedcd7e50368bcbd651f4c71d425af244a (patch) | |
| tree | 56d5932db5327a6713cf266c603eb79f7cb5ad00 /src/compiler/GF/Compile/GetGrammar.hs | |
| parent | fe065b5ee417f1f155edeeeafdf6f3d2c21da130 (diff) | |
Some refactoring in GF.Compile and GF.Compile.GetGrammar
Move source transcoding function GF.Compile to GF.Compile.GetGrammar, in
preparation for doing transcoding before lexing.
Diffstat (limited to 'src/compiler/GF/Compile/GetGrammar.hs')
| -rw-r--r-- | src/compiler/GF/Compile/GetGrammar.hs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/compiler/GF/Compile/GetGrammar.hs b/src/compiler/GF/Compile/GetGrammar.hs index 17477f49a..2f40d0242 100644 --- a/src/compiler/GF/Compile/GetGrammar.hs +++ b/src/compiler/GF/Compile/GetGrammar.hs @@ -20,31 +20,39 @@ import GF.Data.Operations import GF.System.Catch import GF.Infra.UseIO -import GF.Infra.Option(Options,optPreprocessors,addOptions,flag) +import GF.Infra.Option(Options,optPreprocessors,addOptions,optEncoding,flag,renameEncoding) import GF.Grammar.Lexer import GF.Grammar.Parser import GF.Grammar.Grammar +import GF.Compile.Coding ---import GF.Compile.ReadFiles - ---import Data.Char (toUpper) import qualified Data.ByteString.Char8 as BS import Control.Monad (foldM) import System.Cmd (system) +import System.IO(mkTextEncoding) import System.Directory(removeFile) getSourceModule :: Options -> FilePath -> IOE SourceModule getSourceModule opts file0 = ioe $ - do tmp <- foldM runPreprocessor (Source file0) (flag optPreprocessors opts) - content <- keepTemp tmp - case runP pModDef content of - Left (Pn l c,msg) -> do file <- writeTemp tmp - let location = file++":"++show l++":"++show c - return (Bad (location++":\n "++msg)) - Right (i,mi) -> do removeTemp tmp - return (Ok (i,mi{mflags=mflags mi `addOptions` opts, msrc=file0})) + do tmp <- foldM runPreprocessor (Source file0) (flag optPreprocessors opts) + content <- keepTemp tmp + case runP pModDef content of + Left (Pn l c,msg) -> do file <- writeTemp tmp + let location = file++":"++show l++":"++show c + return (Bad (location++":\n "++msg)) + Right (i,mi00) -> + do removeTemp tmp + let mi0 =mi00 {mflags=mflags mi00 `addOptions` opts, msrc=file0} + mi <- transcodeModule (i,mi0) + return (Ok mi) `catch` (return . Bad . show) +transcodeModule sm00 = + do enc <- mkTextEncoding (renameEncoding (flag optEncoding (mflags (snd sm00)))) + let sm = decodeStringsInModule enc sm00 + return sm + + runPreprocessor :: Temporary -> String -> IO Temporary runPreprocessor tmp0 p = maybe external internal (lookup p builtin_preprocessors) |
