|
@@ -5,8 +5,10 @@ module Data.Adnot.Parse (decodeValue) where
|
|
import Control.Applicative((<|>))
|
|
import Control.Applicative((<|>))
|
|
import Data.Attoparsec.ByteString.Char8
|
|
import Data.Attoparsec.ByteString.Char8
|
|
import Data.ByteString (ByteString)
|
|
import Data.ByteString (ByteString)
|
|
|
|
+import qualified Data.ByteString.Char8 as BS
|
|
import qualified Data.Map as M
|
|
import qualified Data.Map as M
|
|
import qualified Data.Text as T
|
|
import qualified Data.Text as T
|
|
|
|
+import qualified Data.Text.Encoding as T
|
|
import qualified Data.Vector as V
|
|
import qualified Data.Vector as V
|
|
|
|
|
|
import Data.Adnot.Type
|
|
import Data.Adnot.Type
|
|
@@ -15,7 +17,7 @@ decodeValue :: ByteString -> Either String Value
|
|
decodeValue = parseOnly pVal
|
|
decodeValue = parseOnly pVal
|
|
where pVal = ws *> (pSum <|> pProd <|> pList <|> pLit)
|
|
where pVal = ws *> (pSum <|> pProd <|> pList <|> pLit)
|
|
pSum = Sum <$> (char '(' *> ws *> pIdent)
|
|
pSum = Sum <$> (char '(' *> ws *> pIdent)
|
|
- <*> (pValueList <* char ')')
|
|
|
|
|
|
+ <*> (pValueList <* ws <* char ')')
|
|
pProd = Product . M.fromList
|
|
pProd = Product . M.fromList
|
|
<$> (char '{' *> pProdBody <* ws <* char '}')
|
|
<$> (char '{' *> pProdBody <* ws <* char '}')
|
|
pProdBody = many' pPair
|
|
pProdBody = many' pPair
|
|
@@ -23,12 +25,13 @@ decodeValue = parseOnly pVal
|
|
pList = List <$> (char '[' *> pValueList <* ws <* char ']')
|
|
pList = List <$> (char '[' *> pValueList <* ws <* char ']')
|
|
pLit = Symbol <$> pIdent
|
|
pLit = Symbol <$> pIdent
|
|
<|> String <$> pString
|
|
<|> String <$> pString
|
|
|
|
+ <|> Double <$> double
|
|
<|> Integer <$> decimal
|
|
<|> Integer <$> decimal
|
|
pValueList = V.fromList <$> many' pVal
|
|
pValueList = V.fromList <$> many' pVal
|
|
pIdent = T.pack <$>
|
|
pIdent = T.pack <$>
|
|
((:) <$> (letter_ascii <|> char '_')
|
|
((:) <$> (letter_ascii <|> char '_')
|
|
<*> many' (letter_ascii <|> digit <|> char '_'))
|
|
<*> many' (letter_ascii <|> digit <|> char '_'))
|
|
- pString = T.pack <$> (char '"' *> manyTill pStrChar (char '"'))
|
|
|
|
|
|
+ pString = T.decodeUtf8 . BS.pack <$> (char '"' *> manyTill pStrChar (char '"'))
|
|
pStrChar = '\n' <$ string "\\n"
|
|
pStrChar = '\n' <$ string "\\n"
|
|
<|> '\t' <$ string "\\t"
|
|
<|> '\t' <$ string "\\t"
|
|
<|> '\r' <$ string "\\r"
|
|
<|> '\r' <$ string "\\r"
|