on master help sign in
Haskell highligth test
9897c99Jonatas
tests/syntax-tests/highlighted/Haskell/test.hsnew file+86
@@ -0,0 +1,86 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
3+-- simple parser for a Lisp-like syntax I wrote some time ago
4+
5+import Data.Void (Void)
6+
7+import Data.Text (Text)
8+import qualified Data.Text as T
9+
10+import Text.Megaparsec.Char
11+import Text.Megaparsec.Error (errorBundlePretty)
12+import Text.Megaparsec hiding (State)
13+import qualified Text.Megaparsec.Char.Lexer as L
14+
15+data LispVal
16+ = Symbol Text
17+ | List [LispVal]
18+ | Number Integer
19+ | String Text
20+ | LispTrue
21+ | LispFalse
22+ | Nil
23+ deriving (Show, Eq)
24+
25+type Parser = Parsec Void Text
26+
27+readStr :: Text -> Either String [LispVal]
28+readStr t =
29+ case parse pLisp "f" t of
30+ Right parsed -> Right parsed
31+ Left err -> Left $ errorBundlePretty err
32+{-# INLINABLE readStr #-}
33+
34+sc :: Parser ()
35+sc = L.space space1 (L.skipLineComment ";") empty
36+{-# INLINABLE sc #-}
37+
38+lexeme :: Parser a -> Parser a
39+lexeme = L.lexeme sc
40+{-# INLINE lexeme #-}
41+
42+symbol :: Text -> Parser Text
43+symbol = L.symbol sc
44+{-# INLINE symbol #-}
45+
46+symbol' :: Text -> Parser Text
47+symbol' = L.symbol' sc
48+{-# INLINE symbol' #-}
49+
50+pNil :: Parser LispVal
51+pNil = symbol' "nil" >> return Nil
52+{-# INLINE pNil #-}
53+
54+integer :: Parser Integer
55+integer = lexeme L.decimal
56+{-# INLINE integer #-}
57+
58+lispSymbols :: Parser Char
59+lispSymbols = oneOf ("#$%&|*+-/:<=>?@^_~" :: String)
60+{-# INLINE lispSymbols #-}
61+
62+pLispVal :: Parser LispVal
63+pLispVal = choice [pList, pNumber, pSymbol, pNil, pString]
64+{-# INLINE pLispVal #-}
65+
66+pSymbol :: Parser LispVal
67+pSymbol = (Symbol . T.pack <$> lexeme (some (letterChar <|> lispSymbols)))
68+{-# INLINABLE pSymbol #-}
69+
70+pList :: Parser LispVal
71+pList = List <$> between (symbol "(") (symbol ")") (many pLispVal)
72+{-# INLINABLE pList #-}
73+
74+pLisp :: Parser [LispVal]
75+pLisp = some pLispVal
76+{-# INLINE pLisp #-}
77+
78+pNumber :: Parser LispVal
79+pNumber = Number <$> integer
80+{-# INLINE pNumber #-}
81+
82+pString :: Parser LispVal
83+pString = do
84+ str <- char '\"' *> manyTill L.charLiteral (char '\"')
85+ return $ String (T.pack str)
86+{-# INLINABLE pString #-}
tests/syntax-tests/source/Haskell/test.hsnew file+86
@@ -0,0 +1,86 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
3+-- simple parser for a Lisp-like syntax I wrote some time ago
4+
5+import Data.Void (Void)
6+
7+import Data.Text (Text)
8+import qualified Data.Text as T
9+
10+import Text.Megaparsec.Char
11+import Text.Megaparsec.Error (errorBundlePretty)
12+import Text.Megaparsec hiding (State)
13+import qualified Text.Megaparsec.Char.Lexer as L
14+
15+data LispVal
16+ = Symbol Text
17+ | List [LispVal]
18+ | Number Integer
19+ | String Text
20+ | LispTrue
21+ | LispFalse
22+ | Nil
23+ deriving (Show, Eq)
24+
25+type Parser = Parsec Void Text
26+
27+readStr :: Text -> Either String [LispVal]
28+readStr t =
29+ case parse pLisp "f" t of
30+ Right parsed -> Right parsed
31+ Left err -> Left $ errorBundlePretty err
32+{-# INLINABLE readStr #-}
33+
34+sc :: Parser ()
35+sc = L.space space1 (L.skipLineComment ";") empty
36+{-# INLINABLE sc #-}
37+
38+lexeme :: Parser a -> Parser a
39+lexeme = L.lexeme sc
40+{-# INLINE lexeme #-}
41+
42+symbol :: Text -> Parser Text
43+symbol = L.symbol sc
44+{-# INLINE symbol #-}
45+
46+symbol' :: Text -> Parser Text
47+symbol' = L.symbol' sc
48+{-# INLINE symbol' #-}
49+
50+pNil :: Parser LispVal
51+pNil = symbol' "nil" >> return Nil
52+{-# INLINE pNil #-}
53+
54+integer :: Parser Integer
55+integer = lexeme L.decimal
56+{-# INLINE integer #-}
57+
58+lispSymbols :: Parser Char
59+lispSymbols = oneOf ("#$%&|*+-/:<=>?@^_~" :: String)
60+{-# INLINE lispSymbols #-}
61+
62+pLispVal :: Parser LispVal
63+pLispVal = choice [pList, pNumber, pSymbol, pNil, pString]
64+{-# INLINE pLispVal #-}
65+
66+pSymbol :: Parser LispVal
67+pSymbol = (Symbol . T.pack <$> lexeme (some (letterChar <|> lispSymbols)))
68+{-# INLINABLE pSymbol #-}
69+
70+pList :: Parser LispVal
71+pList = List <$> between (symbol "(") (symbol ")") (many pLispVal)
72+{-# INLINABLE pList #-}
73+
74+pLisp :: Parser [LispVal]
75+pLisp = some pLispVal
76+{-# INLINE pLisp #-}
77+
78+pNumber :: Parser LispVal
79+pNumber = Number <$> integer
80+{-# INLINE pNumber #-}
81+
82+pString :: Parser LispVal
83+pString = do
84+ str <- char '\"' *> manyTill L.charLiteral (char '\"')
85+ return $ String (T.pack str)
86+{-# INLINABLE pString #-}