-
Notifications
You must be signed in to change notification settings - Fork 2
/
CommandParser.hs
44 lines (36 loc) · 1.27 KB
/
CommandParser.hs
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
module CommandParser where
import Text.ParserCombinators.Parsec
import Parser
import Command
bindingParser :: Parser Command
bindingParser = do string "let"
spaces
name <- many1 (noneOf ".\\() =")
spaces
char '='
spaces
expr <- lambdaParser
return $ LetStmt name expr
simpleExpressionParser :: Parser Command
simpleExpressionParser = do expr <- lambdaParser
return $ SimpleExpression expr
loadParser :: Parser Command
loadParser = do string "load"
spaces
name <- many1 (noneOf " ")
return $ LoadCmd name
setParser :: Parser Command
setParser = do string "set"
spaces
flag <- many1 (noneOf " ")
return $ SetCmd flag
-- TODO: Improve commandParser (i.e. not so many try's)
commandParser :: Parser Command
commandParser = (try bindingParser)
<|> (try loadParser)
<|> (try setParser)
<|> (try simpleExpressionParser)
parseCommand :: String -> Maybe Command
parseCommand s = case parse commandParser "(unknown)" s of
Right e -> Just e
Left _ -> Nothing