S-expressions: Difference between revisions

→‎{{header|Haskell}}: Additional output, expression serialized from parse tree.
(→‎{{header|Haskell}}: Adjusted type of parser. Added Val -> Tree for diagramming.)
(→‎{{header|Haskell}}: Additional output, expression serialized from parse tree.)
Line 3,036:
import Data.List.Split (splitOn)
import Data.Maybe (catMaybes, fromMaybe, listToMaybe)
import Data.Tree (Forest, Tree (..), drawForest, foldTree)
 
------------------------ DATA TYPE -----------------------
Line 3,046:
| List [Val]
deriving (Eq, Show, Read)
 
instance Semigroup Val where
List a <> List b = List (a <> b)
Line 3,061:
" (data (!@# (4.5) \"(more\" \"data)\")))"
]
putStrLn $ drawVal $ parse = fst (parseExpr (tokenized expr))
 
putStrLn $ treeDiagram $ forestFromVal parse
putStrLn "Serialized from the parse tree:\n"
putStrLn $ litVal parse
 
------------------- S-EXPRESSION PARSER ------------------
Line 3,118 ⟶ 3,122:
----------------------- DIAGRAMMING ----------------------
 
drawValtreeDiagram :: Forest Val -> String
drawVal vtreeDiagram = drawForest $. fmap (fmap show) (forestFromVal v)
 
forestFromVal :: Val -> Forest Val
Line 3,128 ⟶ 3,132:
Node (Symbol "List") (treeFromVal <$> xs)
treeFromVal v = Node v []
 
------------------------ FORMATTING ----------------------
 
ppExpr trees = unwords (go <$> trees)
where
go (Node v xs) = "OK"
 
litVal (Symbol x) = x
litVal (Int x) = show x
litVal (Float x) = show x
litVal (String x) = '"' : x <> "\""
litVal (List [List xs]) = litVal (List xs)
litVal (List xs) = "(" <> unwords (litVal <$> xs) <> ")"
 
------------------------- GENERIC ------------------------
Line 3,161 ⟶ 3,178:
+- String "(more"
|
`- String "data)"</pre>
 
 
Serialized from the parse tree:
 
((data "quoted data" 123 4.5) (data (!@# (4.5) "(more" "data)")))</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
9,655

edits