1- {-# LANGUAGE DeriveFunctor #-}
21{-# LANGUAGE OverloadedStrings #-}
32
43module Bot.Expr where
54
65import Control.Applicative
6+ import Data.Tuple
77import Data.Char
88import qualified Data.Text as T
9- import Data.Tuple
9+
10+ import HyperNerd.Parser
1011
1112data Expr
1213 = TextExpr T. Text
@@ -17,37 +18,6 @@ data Expr
1718
1819type NameTable = ()
1920
20- data ParserStop
21- = EOF
22- | SyntaxError T. Text
23- deriving (Eq , Show )
24-
25- newtype Parser a = Parser
26- { runParser :: T. Text -> Either ParserStop (T. Text , a )
27- } deriving (Functor )
28-
29- instance Applicative Parser where
30- pure x = Parser $ \ text -> Right (text, x)
31- (Parser f) <*> (Parser x) =
32- Parser $ \ input1 -> do
33- (input2, f') <- f input1
34- (input3, x') <- x input2
35- return (input3, f' x')
36-
37- instance Monad Parser where
38- Parser a >>= f =
39- Parser $ \ input1 -> do
40- (input2, b) <- a input1
41- runParser (f b) input2
42-
43- instance Alternative Parser where
44- empty = Parser $ const $ Left EOF
45- (Parser p1) <|> (Parser p2) =
46- Parser $ \ input ->
47- case (p1 input, p2 input) of
48- (Left _, x) -> x
49- (x, _) -> x
50-
5121symbol :: Parser T. Text
5222symbol = notNull " Symbol name cannot be empty" $ takeWhileP isAlphaNum
5323
@@ -58,12 +28,6 @@ stringLiteral = do
5828 _ <- charP ' "'
5929 return $ TextExpr value
6030
61- sepBy :: Parser a -> Parser b -> Parser [a ]
62- sepBy element sep = do
63- arg <- element
64- args <- many (sep >> element)
65- return (arg : args)
66-
6731funcallarg :: Parser Expr
6832funcallarg = funcall <|> var <|> stringLiteral
6933
@@ -77,28 +41,6 @@ funcall = do
7741 _ <- whitespaces >> charP ' )'
7842 return $ FunCallExpr name args
7943
80- charP :: Char -> Parser Char
81- charP a =
82- Parser $ \ input ->
83- case T. uncons input of
84- Just (b, rest)
85- | a == b -> Right (rest, b)
86- _ -> Left $ SyntaxError (" Expected `" <> T. pack [a] <> " `" )
87-
88- takeWhileP :: (Char -> Bool ) -> Parser T. Text
89- takeWhileP p = Parser $ \ input -> return $ swap $ T. span p input
90-
91- syntaxError :: T. Text -> Parser a
92- syntaxError message = Parser $ \ _ -> Left $ SyntaxError message
93-
94- notNull :: T. Text -> Parser T. Text -> Parser T. Text
95- notNull message next =
96- next >>=
97- (\ value ->
98- if T. null value
99- then syntaxError message
100- else return value)
101-
10244whitespaces :: Parser T. Text
10345whitespaces = takeWhileP isSpace
10446
0 commit comments