Skip to content

Instantly share code, notes, and snippets.

@JacobLeach
Last active August 29, 2015 13:57
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 JacobLeach/9842083 to your computer and use it in GitHub Desktop.
Save JacobLeach/9842083 to your computer and use it in GitHub Desktop.
Simple Expression Parser
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative ((<|>))
import Data.Attoparsec.Text
import System.Environment
import Data.Text
data Expression = Expression Int Op Expression |
Value Int
deriving (Show)
data Op = Add | Subtract | Divide | Multiply deriving (Show)
{--eval :: Expression -> Int
eval (Expression x Add y) = x + y
eval (Expression x Subtract y) = x - y
eval (Expression x Divide y) = x `quot` y
eval (Expression x Multiply y) = x * y
--}
parseValue :: Parser Int
parseValue = decimal
parseExpression :: Parser Expression
parseExpression =
(parseValue >>= \p1 ->
parseOp >>= \p2 ->
parseExpression >>= \p3 ->
return (Expression p1 p2 p3))
<|> (parseValue >>= \p1 ->
return (Value p1))
{--parseExpression :: Parser Expression
parseExpression =
parseExpression >>= \p1 ->
parseOp >>= \p2 ->
decimal >>= \p3 ->
endOfInput >> (return (Expression' p1 p2 p3))
parseExpression :: Parser Expression
parseExpression =
decimal >>= \p1 ->
parseOp >>= \p2 ->
decimal >>= \p3 ->
return (Expression p1 p2 p3)
--}
parseOp :: Parser Op
parseOp =
(char '+' >> return Add)
<|> (char '-' >> return Subtract)
<|> (char '/' >> return Divide)
<|> (char '*' >> return Multiply)
test :: String -> IO ()
test string = print (parseOnly parseExpression (pack string))
main :: IO ()
main = do
args <- getArgs
(print (parseOnly parseExpression (pack (args !! 0))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment