Advertisement
swarley

parser.hs

Sep 24th, 2011
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Main where
  2. import Monad
  3. import System.Environment
  4. import Text.ParserCombinators.Parsec hiding (spaces)
  5.  
  6. main :: IO ()
  7. main = do args <- getArgs
  8.           putStrLn (readExpr (args !! 0) )
  9.          
  10. symbol :: Parser Char
  11. symbol = oneOf "!$%&|*+-/:<=?>@^_~#"
  12.  
  13. readExpr :: String -> String
  14. readExpr input = case parse parseExpr "lisp" input of
  15.     Left err -> " No match: " ++ show err
  16.     Right val -> "Found value"
  17.  
  18. spaces :: Parser ()
  19. spaces = skipMany1 space
  20.  
  21. data LispVal = Atom String
  22.              | List [LispVal]
  23.              | DottedList [LispVal] LispVal
  24.              | Number Integer
  25.              | String String
  26.              | Bool Bool
  27.  
  28. parseString :: Parser LispVal
  29. parseString = do char '"'
  30.                  x <- many (noneOf "\"")
  31.                  char '"'
  32.                  return $ String x
  33.                  
  34. parseAtom :: Parser LispVal
  35. parseAtom = do first <- letter <|> symbol
  36.                rest <- many (letter <|> digit <|> symbol)
  37.                let atom = [first] ++ rest
  38.                return $ case atom of
  39.                              "#t" -> Bool True
  40.                              "#f" -> Bool False
  41.                              otherwise -> Atom atom
  42.                              
  43. parseNumber :: Parser LispVal
  44. parseNumber = liftM (Number . read) $ many1 digit
  45.  
  46. parseExpr :: Parser LispVal
  47. parseExpr = parseAtom
  48.         <|> parseString
  49.         <|> parseNumber
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement