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 $ treeDiagram $ forestFromVal parse
putStrLn "Serialized from the parse tree:\n"
putStrLn $ litVal parse
------------------- S-EXPRESSION PARSER ------------------
Line 3,118 ⟶ 3,122:
----------------------- DIAGRAMMING ----------------------
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)"
Serialized from the parse tree:
((data "quoted data" 123 4.5) (data (!@# (4.5) "(more" "data)")))</pre>
=={{header|Icon}} and {{header|Unicon}}==
|