---------------------------------------------------------------------- -- | -- Module : IOGrammar -- Maintainer : Aarne Ranta -- Stability : (stable) -- Portability : (portable) -- -- > CVS $Date: 2005/02/18 19:21:06 $ -- > CVS $Author: peb $ -- > CVS $Revision: 1.14 $ -- -- for reading grammars and terms from strings and files ----------------------------------------------------------------------------- module IOGrammar (shellStateFromFiles, getShellStateFromFiles) where import Abstract import qualified GFC import PGrammar import TypeCheck import Compile import ShellState import Modules import ReadFiles (isOldFile) import Option import Operations import UseIO import Arch import Monad (liftM) -- | a heuristic way of renaming constants is used string2absTerm :: String -> String -> Term string2absTerm m = renameTermIn m . pTrm renameTermIn :: String -> Term -> Term renameTermIn m = refreshMetas [] . rename [] where rename vs t = case t of Abs x b -> Abs x (rename (x:vs) b) Vr c -> if elem c vs then t else Q (zIdent m) c App f a -> App (rename vs f) (rename vs a) _ -> t string2annotTree :: GFC.CanonGrammar -> Ident -> String -> Err Tree string2annotTree gr m = annotate gr . string2absTerm (prt m) ---- prt ----string2paramList :: ConcreteST -> String -> [Term] ---string2paramList st = map (renameTrm (lookupConcrete st) . patt2term) . pPattList shellStateFromFiles :: Options -> ShellState -> FilePath -> IOE ShellState shellStateFromFiles opts st file = case fileSuffix file of "gfcm" -> do cenv <- compileOne opts (compileEnvShSt st []) file ioeErr $ updateShellState opts Nothing st cenv s | elem s ["cf","ebnf"] -> do let osb = addOptions (options [beVerbose]) opts grts <- compileModule osb st file ioeErr $ updateShellState opts Nothing st grts _ -> do b <- ioeIO $ isOldFile file let opts' = if b then (addOption showOld opts) else opts let osb = if oElem showOld opts' then addOptions (options [beVerbose]) opts' -- for old no emit else addOptions (options [beVerbose, emitCode]) opts' grts <- compileModule osb st file let top = identC $ justModuleName file ioeErr $ updateShellState opts' (Just top) st grts --- liftM (changeModTimes rts) $ grammar2shellState opts gr getShellStateFromFiles :: Options -> FilePath -> IO ShellState getShellStateFromFiles os = useIOE emptyShellState . shellStateFromFiles os emptyShellState