{-# LANGUAGE LambdaCase, FlexibleContexts #-}
module Syntax where
type Ident = String
data Program = Program [Decl]
deriving (Int -> Program -> ShowS
[Program] -> ShowS
Program -> String
(Int -> Program -> ShowS)
-> (Program -> String) -> ([Program] -> ShowS) -> Show Program
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Program] -> ShowS
$cshowList :: [Program] -> ShowS
show :: Program -> String
$cshow :: Program -> String
showsPrec :: Int -> Program -> ShowS
$cshowsPrec :: Int -> Program -> ShowS
Show)
data Decl = FunDecl Ident [Ident] Expr
deriving (Int -> Decl -> ShowS
[Decl] -> ShowS
Decl -> String
(Int -> Decl -> ShowS)
-> (Decl -> String) -> ([Decl] -> ShowS) -> Show Decl
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Decl] -> ShowS
$cshowList :: [Decl] -> ShowS
show :: Decl -> String
$cshow :: Decl -> String
showsPrec :: Int -> Decl -> ShowS
$cshowsPrec :: Int -> Decl -> ShowS
Show)
data Expr
= Var Ident
| Lit Literal
| Lambda [Ident] Expr
| If Expr Expr Expr
| Case Expr [(Pattern, Expr)]
| Let [Decl] Expr
| App Expr Expr
| BinOp BinOperator Expr Expr
| UnOp UnOperator Expr
| List [Expr]
| Tuple [Expr]
deriving (Int -> Expr -> ShowS
[Expr] -> ShowS
Expr -> String
(Int -> Expr -> ShowS)
-> (Expr -> String) -> ([Expr] -> ShowS) -> Show Expr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Expr] -> ShowS
$cshowList :: [Expr] -> ShowS
show :: Expr -> String
$cshow :: Expr -> String
showsPrec :: Int -> Expr -> ShowS
$cshowsPrec :: Int -> Expr -> ShowS
Show)
data Pattern
= PWildcard
| PVar Ident
| PLit Literal
| PList [Pattern]
| PTuple [Pattern]
deriving (Int -> Pattern -> ShowS
[Pattern] -> ShowS
Pattern -> String
(Int -> Pattern -> ShowS)
-> (Pattern -> String) -> ([Pattern] -> ShowS) -> Show Pattern
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Pattern] -> ShowS
$cshowList :: [Pattern] -> ShowS
show :: Pattern -> String
$cshow :: Pattern -> String
showsPrec :: Int -> Pattern -> ShowS
$cshowsPrec :: Int -> Pattern -> ShowS
Show)
data Literal
= LInt Int
| LFloat Double
| LChar Char
| LString String
| LBool Bool
deriving (Int -> Literal -> ShowS
[Literal] -> ShowS
Literal -> String
(Int -> Literal -> ShowS)
-> (Literal -> String) -> ([Literal] -> ShowS) -> Show Literal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Literal] -> ShowS
$cshowList :: [Literal] -> ShowS
show :: Literal -> String
$cshow :: Literal -> String
showsPrec :: Int -> Literal -> ShowS
$cshowsPrec :: Int -> Literal -> ShowS
Show)
data BinOperator
= Add
| Sub
| Mul
| Div
| Mod
| Eq
| Neq
| Lt
| Le
| Gt
| Ge
| And
| Or
deriving (Int -> BinOperator -> ShowS
[BinOperator] -> ShowS
BinOperator -> String
(Int -> BinOperator -> ShowS)
-> (BinOperator -> String)
-> ([BinOperator] -> ShowS)
-> Show BinOperator
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BinOperator] -> ShowS
$cshowList :: [BinOperator] -> ShowS
show :: BinOperator -> String
$cshow :: BinOperator -> String
showsPrec :: Int -> BinOperator -> ShowS
$cshowsPrec :: Int -> BinOperator -> ShowS
Show)
data UnOperator
= Neg
| Not
deriving (Int -> UnOperator -> ShowS
[UnOperator] -> ShowS
UnOperator -> String
(Int -> UnOperator -> ShowS)
-> (UnOperator -> String)
-> ([UnOperator] -> ShowS)
-> Show UnOperator
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UnOperator] -> ShowS
$cshowList :: [UnOperator] -> ShowS
show :: UnOperator -> String
$cshow :: UnOperator -> String
showsPrec :: Int -> UnOperator -> ShowS
$cshowsPrec :: Int -> UnOperator -> ShowS
Show)