summaryrefslogtreecommitdiff
path: root/src/GF/Devel/GFI.hs
blob: f59bd15e6d8da3290a1c2a1870c7319fcd7a1e55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
module GF.Devel.GFI (mainGFI) where

import GF.Command.Interpreter
import GF.Command.Importing
import GF.Command.Commands
import GF.GFCC.API

import GF.Devel.UseIO
import GF.Devel.Arch
import GF.Infra.Option ---- Haskell's option lib


mainGFI :: [String] -> IO ()
mainGFI xx = do
  putStrLn welcome
  env <- importInEnv emptyMultiGrammar xx
  loop (GFEnv env [] 0)
  return ()

loop :: GFEnv -> IO GFEnv
loop gfenv0 = do
  let env = commandenv gfenv0
  putStrFlush (prompt env)
  s <- getLine
  let gfenv = gfenv0 {history = s : history gfenv0}
  case words s of

  -- special commands, working on GFEnv
    "i":args -> do
      env1 <- importInEnv (multigrammar env) args
      loopNewCPU $ gfenv {commandenv = env1}
    "e":_ -> loopNewCPU $ gfenv {commandenv=env{multigrammar=emptyMultiGrammar}}
    "ph":_ -> mapM_ putStrLn (reverse (history gfenv0)) >> loopNewCPU gfenv
    "q":_  -> putStrLn "See you." >> return gfenv

  -- ordinary commands, working on CommandEnv
    _ -> do
      interpretCommandLine env s
      loopNewCPU gfenv

loopNewCPU gfenv = do
  cpu <- prCPU $ cputime gfenv
  loop $ gfenv {cputime = cpu}

importInEnv mgr0 xx = do
  let (opts,files) = getOptions "-" xx
  mgr1 <- case files of
    [] -> return mgr0
    _  -> importGrammar mgr0 opts files
  let env = CommandEnv mgr1 (allCommands mgr1)
  putStrLn $ unwords $ "\nLanguages:" : languages mgr1
  return env

welcome = unlines [
  "                              ",
  "         *  *  *              ",
  "      *           *           ",
  "    *               *         ",
  "   *                          ",
  "   *                          ",
  "   *        * * * * * *       ",
  "   *        *         *       ",
  "    *       * * * *  *        ",
  "      *     *      *          ",
  "         *  *  *              ",
  "                              ",
  "This is GF version 3.0 alpha. ",
  "Some things may work.         "
  ]

prompt env = abstractName (multigrammar env) ++ "> "

data GFEnv = GFEnv {
  commandenv :: CommandEnv,
  history    :: [String],
  cputime    :: Integer
  }