Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main where
- import Monad
- import System.Environment
- import Text.ParserCombinators.Parsec hiding (spaces)
- main :: IO ()
- main = do args <- getArgs
- putStrLn (readExpr (args !! 0) )
- symbol :: Parser Char
- symbol = oneOf "!$%&|*+-/:<=?>@^_~#"
- readExpr :: String -> String
- readExpr input = case parse parseExpr "lisp" input of
- Left err -> " No match: " ++ show err
- Right val -> "Found value"
- spaces :: Parser ()
- spaces = skipMany1 space
- data LispVal = Atom String
- | List [LispVal]
- | DottedList [LispVal] LispVal
- | Number Integer
- | String String
- | Bool Bool
- parseString :: Parser LispVal
- parseString = do char '"'
- x <- many (noneOf "\"")
- char '"'
- return $ String x
- parseAtom :: Parser LispVal
- parseAtom = do first <- letter <|> symbol
- rest <- many (letter <|> digit <|> symbol)
- let atom = [first] ++ rest
- return $ case atom of
- "#t" -> Bool True
- "#f" -> Bool False
- otherwise -> Atom atom
- parseNumber :: Parser LispVal
- parseNumber = liftM (Number . read) $ many1 digit
- parseExpr :: Parser LispVal
- parseExpr = parseAtom
- <|> parseString
- <|> parseNumber
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement