Skip to content

Instantly share code, notes, and snippets.

@joshcough
Created September 18, 2014 18:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joshcough/d2e4ba1a2c93cdaedc81 to your computer and use it in GitHub Desktop.
Save joshcough/d2e4ba1a2c93cdaedc81 to your computer and use it in GitHub Desktop.
sexprParser :: Parser SExpr
sexprParser = choice [intParser, symParser, listParser]
symParser :: Parser SExpr
symParser = AtomSym <$> ident variable
variable :: TokenParsing m => IdentifierStyle m
variable = IdentifierStyle
{ _styleName = "identifier"
, _styleStart = varInit
, _styleLetter = varSubsequent
, _styleReserved = HashSet.empty
, _styleHighlight = Highlight.Identifier
, _styleReservedHighlight = Highlight.ReservedConstructor
} where
varInit = letter <|> oneOf "!$%&*/:<=>?~_^"
varSubsequent = varInit <|> digit <|> oneOf ".+="
intParser :: Parser SExpr
intParser = AtomNum . fromInteger <$> integer
listParser :: Parser SExpr
listParser = List <$> (parens $ some sexprParser)
runParser :: Parser a -> String -> ParseResult a
runParser p s = case parseByteString p mempty (UTF8.fromString s) of
Failure xs -> Left $ show xs
Success a -> Right a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment