summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Command/Interpreter.hs
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2015-08-10 13:01:02 +0000
committerhallgren <hallgren@chalmers.se>2015-08-10 13:01:02 +0000
commitd38efbaa6a2c94218bb65925bd9ad6c028dfbfd6 (patch)
tree6b6f5b8d34e9d5daa8d021d0d748d64cb993b188 /src/compiler/GF/Command/Interpreter.hs
parent20644d02990f7510812fcb47d33ad20a27be48ab (diff)
Refactor GF shell modules to improve modularity and reusability
+ Move type CommandInfo from GF.Command.Commands to a new module GF.Commands.CommandInfo and make it independent of the PGF type. + Make the module GF.Command.Interpreter independent of the PGF type and eliminate the import of GF.Command.Commands. + Move the implementation of the "help" command to its own module GF.Command.Help
Diffstat (limited to 'src/compiler/GF/Command/Interpreter.hs')
-rw-r--r--src/compiler/GF/Command/Interpreter.hs59
1 files changed, 26 insertions, 33 deletions
diff --git a/src/compiler/GF/Command/Interpreter.hs b/src/compiler/GF/Command/Interpreter.hs
index 3b0f77ace..8650b4002 100644
--- a/src/compiler/GF/Command/Interpreter.hs
+++ b/src/compiler/GF/Command/Interpreter.hs
@@ -1,44 +1,37 @@
module GF.Command.Interpreter (
- CommandEnv,commands,multigrammar,commandmacros,expmacros,
+ CommandEnv,pgfenv,commands,commandmacros,expmacros,
mkCommandEnv,
- emptyCommandEnv,
+--emptyCommandEnv,
interpretCommandLine,
- interpretPipe,
+--interpretPipe,
getCommandOp
) where
import Prelude hiding (putStrLn)
-import GF.Command.Commands
+import GF.Command.CommandInfo
import GF.Command.Abstract
import GF.Command.Parse
-import PGF
-import PGF.Internal
+--import PGF
+import PGF.Internal(Expr(..))
--import PGF.Morphology
-import GF.Infra.SIO
+import GF.Infra.SIO(putStrLn,putStrLnFlush)
-import GF.Text.Pretty
+import GF.Text.Pretty(render)
import Control.Monad(when)
--import Control.Monad.Error()
import qualified Data.Map as Map
-data CommandEnv = CommandEnv {
- multigrammar :: PGF,
- morphos :: Map.Map Language Morpho,
---commands :: Map.Map String CommandInfo,
+data CommandEnv env = CommandEnv {
+ pgfenv :: env,
+ commands :: Map.Map String (CommandInfo env),
commandmacros :: Map.Map String CommandLine,
expmacros :: Map.Map String Expr
}
-commands _ = allCommands
-mkCommandEnv :: PGF -> CommandEnv
-mkCommandEnv pgf =
- let mos = Map.fromList [(la,buildMorpho pgf la) | la <- languages pgf] in
- CommandEnv pgf mos {-allCommands-} Map.empty Map.empty
+--mkCommandEnv :: PGFEnv -> CommandEnv
+mkCommandEnv env cmds = CommandEnv env cmds Map.empty Map.empty
-emptyCommandEnv :: CommandEnv
-emptyCommandEnv = mkCommandEnv emptyPGF
-
-interpretCommandLine :: CommandEnv -> String -> SIO ()
+--interpretCommandLine :: CommandEnv -> String -> SIO ()
interpretCommandLine env line =
case readCommandLine line of
Just [] -> return ()
@@ -48,7 +41,7 @@ interpretCommandLine env line =
interpretPipe env cs = do
Piped v@(_,s) <- intercs void cs
putStrLnFlush s
- return v
+ return ()
where
intercs treess [] = return treess
intercs (Piped (trees,_)) (c:cs) = do
@@ -82,32 +75,32 @@ appCommand xs c@(Command i os arg) = case arg of
EFun x -> EFun x
-- return the trees to be sent in pipe, and the output possibly printed
-interpret :: CommandEnv -> [Expr] -> Command -> SIO CommandOutput
+--interpret :: CommandEnv -> [Expr] -> Command -> SIO CommandOutput
interpret env trees comm =
case getCommand env trees comm of
Left msg -> do putStrLn ('\n':msg)
return void
- Right (info,opts,trees) -> do let cmdenv = (multigrammar env,morphos env)
+ Right (info,opts,trees) -> do let cmdenv = pgfenv env
tss@(Piped (_,s)) <- exec info cmdenv opts trees
when (isOpt "tr" opts) $ putStrLn s
return tss
-- analyse command parse tree to a uniform datastructure, normalizing comm name
--- the env is needed for macro lookup
-getCommand :: CommandEnv -> [Expr] -> Command -> Either String (CommandInfo,[Option],[Expr])
+--getCommand :: CommandEnv -> [Expr] -> Command -> Either String (CommandInfo PGFEnv,[Option],[Expr])
getCommand env es co@(Command c opts arg) = do
info <- getCommandInfo env c
checkOpts info opts
es <- getCommandTrees env (needsTypeCheck info) arg es
return (info,opts,es)
-getCommandInfo :: CommandEnv -> String -> Either String CommandInfo
+--getCommandInfo :: CommandEnv -> String -> Either String (CommandInfo PGFEnv)
getCommandInfo env cmd =
- case lookCommand (getCommandOp cmd) (commands env) of
+ case Map.lookup (getCommandOp cmd) (commands env) of
Just info -> return info
- Nothing -> fail $ "command " ++ cmd ++ " not interpreted"
+ Nothing -> fail $ "command not found: " ++ cmd
-checkOpts :: CommandInfo -> [Option] -> Either String ()
+checkOpts :: CommandInfo env -> [Option] -> Either String ()
checkOpts info opts =
case
[o | OOpt o <- opts, notElem o ("tr" : map fst (options info))] ++
@@ -117,16 +110,16 @@ checkOpts info opts =
[o] -> fail $ "option not interpreted: " ++ o
os -> fail $ "options not interpreted: " ++ unwords os
-getCommandTrees :: CommandEnv -> Bool -> Argument -> [Expr] -> Either String [Expr]
+--getCommandTrees :: CommandEnv -> Bool -> Argument -> [Expr] -> Either String [Expr]
getCommandTrees env needsTypeCheck a es =
case a of
AMacro m -> case Map.lookup m (expmacros env) of
Just e -> return [e]
_ -> return []
AExpr e -> if needsTypeCheck
- then case inferExpr (multigrammar env) e of
- Left tcErr -> fail $ render (ppTcError tcErr)
- Right (e,ty) -> return [e] -- ignore piped
+ then case typeCheckArg (pgfenv env) e of
+ Left tcErr -> fail $ render tcErr
+ Right e -> return [e] -- ignore piped
else return [e]
ANoArg -> return es -- use piped