S-expressions: Difference between revisions

m
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 [] = List []
firstParse (x : _) = x
parses =
Line 3,092 ⟶ 3,091:
<$> ( fmap
(<> (' ' : s))
[ "Int", "Integer", "Float", "Double"]
"Integer",
"Float",
"Double"
]
<> ["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]]</lang>
 
spacedBrackets :: String -> String
spacedBrackets [] = []
spacedBrackets (c : cs)
| c `elem` "()" = ' ' : c : " " <> spacedBrackets cs
| otherwise = c : spacedBrackets cs</lang>
{{Out}}
<pre>Symbol "List"
9,655

edits