S-expressions: Difference between revisions

Content added Content deleted
Line 3,063: Line 3,063:
parseExpr = go
parseExpr = go
where
where
go tokens = until finished parseToken ([], tokens)

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

parseToken (trees, []) = (trees, [])
parseToken (trees, []) = (trees, [])
parseToken (trees, "(" : rest) =
parseToken (trees, "(" : rest) =
Line 3,072: Line 3,076:
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)


----------------------- TOKEN PARSER ---------------------
----------------------- TOKEN PARSER ---------------------
Line 3,085: Line 3,085:
atom s = firstParse parses
atom s = firstParse parses
where
where
firstParse [] = List []
firstParse (x : _) = x
firstParse (x : _) = x
parses =
parses =
Line 3,092: Line 3,091:
<$> ( fmap
<$> ( fmap
(<> (' ' : s))
(<> (' ' : s))
[ "Int",
["Int", "Integer", "Float", "Double"]
"Integer",
"Float",
"Double"
]
<> ["Symbol \"" <> s <> "\""]
<> ["Symbol \"" <> s <> "\""]
)
)
Line 3,111: Line 3,106:
go token@('"' : _) = [token]
go token@('"' : _) = [token]
go s = words $ spacedBrackets s
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]
quoteTokens :: Char -> String -> [String]
Line 3,124: Line 3,113:
go (i, k)
go (i, k)
| even i = [k]
| even i = [k]
| otherwise = [q : k <> [q]]</lang>
| otherwise = [q : k <> [q]]

spacedBrackets :: String -> String
spacedBrackets [] = []
spacedBrackets (c : cs)
| c `elem` "()" = ' ' : c : " " <> spacedBrackets cs
| otherwise = c : spacedBrackets cs</lang>
{{Out}}
{{Out}}
<pre>Symbol "List"
<pre>Symbol "List"