S-expressions: Difference between revisions

→‎{{header|Haskell}}: Adjusted type of parser. Added Val -> Tree for diagramming.
(→‎{{header|Haskell}}: Adjusted type of parser. Added Val -> Tree for diagramming.)
Line 3,036:
import Data.List.Split (splitOn)
import Data.Maybe (catMaybes, fromMaybe, listToMaybe)
import Data.Tree (Forest, Tree (..), drawForest)
 
------------------------ DATA TYPE -----------------------
Line 3,046:
| List [Val]
deriving (Eq, Show, Read)
instance Semigroup Val where
List a <> List b = List (a <> b)
 
instance Monoid Val where
mempty = List []
 
--------------------------- MAIN -------------------------
Line 3,055 ⟶ 3,061:
" (data (!@# (4.5) \"(more\" \"data)\")))"
]
putStrLn $ drawVal $ fst (parseExpr (tokenized expr))
drawForest $
fmap show
<$> fst (parseExpr (tokenized expr))
 
------------------- S-EXPRESSION PARSER ------------------
 
parseExpr :: [String] -> ([Tree Val], [String])
parseExpr = until finished parseToken . ([]mempty,)
where
finished (_, []) = True
finished (_, token : _) = ")" == token
 
parseToken (treesv, "(" : rest) =
bimap
((treesv <>) . returnList . Node (Symbol "List")return)
tail
(parseExpr rest)
parseToken (treesv, ")" : rest) = (treesv, rest)
parseToken (treesv, t : rest) =
(treesv <> List [Node (atom t) []], rest)
 
----------------------- TOKEN PARSER ---------------------
 
atom :: String -> Val
atom [] = List []mempty
atom s@('"' : _) =
fromMaybe (List [])mempty (maybeRead ("String " <> s))
atom s =
headDef (Symbol s) $
catMaybes $
maybeRead . (s <>) . (' ' : s)) <$> ["Int", "Float"]
 
maybeRead :: String -> Maybe Val
Line 3,112 ⟶ 3,115:
| c `elem` "()" = ' ' : c : " " <> spacedBrackets cs
| otherwise = c : spacedBrackets cs
 
----------------------- DIAGRAMMING ----------------------
 
drawVal :: Val -> String
drawVal v = drawForest $ fmap (fmap show) (forestFromVal v)
 
forestFromVal :: Val -> Forest Val
forestFromVal (List xs) = treeFromVal <$> xs
 
treeFromVal :: Val -> Tree Val
treeFromVal (List xs) =
Node (Symbol "List") (treeFromVal <$> xs)
treeFromVal v = Node v []
 
------------------------- GENERIC ------------------------
9,655

edits