S-expressions: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: Added a variant which parses by hand and shows a parse tree diagram.)
Line 3,064: Line 3,064:
<$> fst (parseExpr (tokenized expr))
<$> fst (parseExpr (tokenized expr))


------------------ PARSING S-EXPRESSIONS -----------------
------------------- S-EXPRESSIONS PARSER -----------------


parseExpr :: [String] -> ([Tree Val], [String])
parseExpr :: [String] -> ([Tree Val], [String])
parseExpr = go
parseExpr = go
where
where
finished (_, []) = True
finished (_, ")" : _) = True
finished (_, _) = False

parseToken (trees, []) = (trees, [])
parseToken (trees, []) = (trees, [])
parseToken (trees, "(" : rest) =
parseToken (trees, "(" : rest) =
Line 3,082: Line 3,078:
parseToken (trees, t : rest) =
parseToken (trees, t : rest) =
(trees <> [Node (atom t) []], rest)
(trees <> [Node (atom t) []], rest)

finished (_, rest) = null rest || ")" == head rest


go tokens = until finished parseToken ([], tokens)
go tokens = until finished parseToken ([], tokens)


---------------------- PARSING TOKENS --------------------
---------------------- TOKENS PARSER ---------------------


atom :: String -> Val
atom :: String -> Val