@@ -19,10 +19,10 @@ module Parser (
1919
2020import Prelude hiding (lex)
2121
22−import Commands
22+import qualified Commands as C
23+import qualified Directive as D
2324
2425import Data.Char (isSpace)
25−import Data.List (isPrefixOf)
2626
2727import Control.Applicative hiding (many)
2828
@@ -34,24 +34,11 @@ import qualified Language.PureScript.Parser.Common as C (mark, same)
3434-- |
3535-- Parses PSCI metacommands or expressions input from the user.
3636--
37−parseCommand :: String -> Either String Command
37+parseCommand :: String -> Either String C.Command
3838parseCommand cmdString =
39− case splitCommand cmdString of
40− Just (cmd, arg)
41− | matches "?" -> return Help
42− | matches "help" -> return Help
43− | matches "quit" -> return Quit
44− | matches "reset" -> return Reset
45− | matches "import" -> Import <$> parseRest P.moduleName arg
46− | matches "browse" -> Browse <$> parseRest P.moduleName arg
47− | matches "module" -> return $ LoadFile (trimEnd arg)
48− | matches "show" -> return $ Show (trimEnd cmd)
49− | matches "type" -> TypeOf <$> parseRest P.parseValue arg
50− | matches "kind" -> KindOf <$> parseRest P.parseType arg
51− | otherwise -> Left $ "Unrecognized command. Type :? for help."
52− where
53− matches = isPrefixOf cmd
54− Nothing -> parseRest (psciLet <|> psciExpression) cmdString
39+ case cmdString of
40+ (':' : cmd) -> parseDirective cmd
41+ _ -> parseRest (psciLet <|> psciExpression) cmdString
5542 where
5643 parseRest :: P.TokenParser a -> String -> Either String a
5744 parseRest p s = either (Left . show) Right $ do
@@ -64,20 +51,26 @@ parseCommand cmdString =
6451 trimEnd :: String -> String
6552 trimEnd = reverse . trimStart . reverse
6653
67− -- |
68− -- Tries to split a command into a directive and the argument.
69− --
70− splitCommand :: String -> Maybe (String, String)
71− splitCommand (':' : cmd) = Just (directive, trimStart arg)
72− where
73− (directive, arg) = break isSpace cmd
74− splitCommand _ = Nothing
54+ parseDirective :: String -> Either String C.Command
55+ parseDirective cmd =
56+ case D.parseDirective dstr of
57+ Just D.Help -> return C.Help
58+ Just D.Quit -> return C.Quit
59+ Just D.Reset -> return C.Reset
60+ Just D.Import -> C.Import <$> parseRest P.moduleName arg
61+ Just D.Browse -> C.Browse <$> parseRest P.moduleName arg
62+ Just D.Load -> return $ C.LoadFile (trimEnd arg)
63+ Just D.Show -> return $ C.Show (trimEnd arg)
64+ Just D.Type -> C.TypeOf <$> parseRest P.parseValue arg
65+ Just D.Kind -> C.KindOf <$> parseRest P.parseType arg
66+ Nothing -> Left $ "Unrecognized command. Type :? for help."
67+ where (dstr, arg) = break isSpace cmd
7568
7669 -- |
7770 -- Parses expressions entered at the PSCI repl.
7871 --
79− psciExpression :: P.TokenParser Command
80− psciExpression = Expression <$> P.parseValue
72+ psciExpression :: P.TokenParser C.Command
73+ psciExpression = C.Expression <$> P.parseValue
8174
8275 -- |
8376 -- PSCI version of @let@.
@@ -85,8 +78,8 @@ parseCommand cmdString =
8578 -- However, since we don't support the @Eff@ monad,
8679 -- we actually want the normal @let@.
8780 --
88− psciLet :: P.TokenParser Command
89− psciLet = Let <$> (P.reserved "let" *> P.indented *> manyDecls)
81+ psciLet :: P.TokenParser C.Command
82+ psciLet = C.Let <$> (P.reserved "let" *> P.indented *> manyDecls)
9083 where
9184 manyDecls :: P.TokenParser [P.Declaration]
9285 manyDecls = C.mark (many1 (C.same *> P.parseDeclaration))