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))
------------------- S-EXPRESSION PARSER ------------------
parseExpr :: [String] -> (
parseExpr = until finished parseToken . (
where
finished (_, []) = True
finished (_, token : _) = ")" == token
parseToken (
bimap
((
tail
(parseExpr rest)
parseToken (
parseToken (
(
----------------------- TOKEN PARSER ---------------------
atom :: String -> Val
atom [] =
atom s@('"' : _) =
fromMaybe
atom s =
headDef (Symbol s) $
catMaybes $
maybeRead . (
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 ------------------------
|