S-expressions: Difference between revisions
m
→{{header|Haskell}}
Line 3,063:
parseExpr = go
where
go tokens = until finished parseToken ([], tokens)▼
finished (_, rest) = null rest || ")" == head rest▼
parseToken (trees, []) = (trees, [])
parseToken (trees, "(" : rest) =
Line 3,072 ⟶ 3,076:
parseToken (trees, t : rest) =
(trees <> [Node (atom t) []], rest)
▲ finished (_, rest) = null rest || ")" == head rest
▲ go tokens = until finished parseToken ([], tokens)
----------------------- TOKEN PARSER ---------------------
Line 3,085:
atom s = firstParse parses
where
firstParse (x : _) = x
parses =
Line 3,092 ⟶ 3,091:
<$> ( fmap
(<> (' ' : s))
[
<> ["Symbol \"" <> s <> "\""]
)
Line 3,111 ⟶ 3,106:
go token@('"' : _) = [token]
go s = words $ spacedBrackets s
spacedBrackets :: String -> String▼
spacedBrackets [] = []▼
spacedBrackets (c : cs)▼
| c `elem` "()" = ' ' : c : " " <> spacedBrackets cs▼
| otherwise = c : spacedBrackets cs▼
quoteTokens :: Char -> String -> [String]
Line 3,124 ⟶ 3,113:
go (i, k)
| even i = [k]
| otherwise = [q : k <> [q]]
▲spacedBrackets :: String -> String
▲spacedBrackets [] = []
▲spacedBrackets (c : cs)
▲ | c `elem` "()" = ' ' : c : " " <> spacedBrackets cs
▲ | otherwise = c : spacedBrackets cs</lang>
{{Out}}
<pre>Symbol "List"
|