Skip to content

Instantly share code, notes, and snippets.

@joshcough
Created September 19, 2014 01:15
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/258f9a9048142e67ee2f to your computer and use it in GitHub Desktop.
Save joshcough/258f9a9048142e67ee2f to your computer and use it in GitHub Desktop.
myToken :: Parser a -> Parser a
myToken p = p <* (lookAhead $ eof <|> someSpace <|> (symbolic ')' >> return ()))
sexprParser :: Parser SExpr
sexprParser = choice [intParser, symParser, listParser]
symParser :: Parser SExpr
symParser = AtomSym <$> myToken (ident variable)
variable :: TokenParsing m => IdentifierStyle m
variable = IdentifierStyle
{ _styleName = "identifier"
, _styleStart = varInit
, _styleLetter = varSubsequent
, _styleReserved = HashSet.empty
, _styleHighlight = Highlight.Identifier
, _styleReservedHighlight = Highlight.ReservedIdentifier
} where
varInit = letter <|> oneOf "!$%&*/:<=>?~_^"
varSubsequent = varInit <|> digit <|> oneOf ".+="
intParser :: Parser SExpr
intParser = AtomNum . fromInteger <$> myToken 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 -> error (show 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