packages feed

caml-parser-0.1.0.0: src/CamlParser/Syntax/Expr.hs

{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
module CamlParser.Syntax.Expr where

import CamlParser.Syntax.Location
import CamlParser.Syntax.Constant
import CamlParser.Syntax.Type
import CamlParser.Syntax.Pattern

data Ident
  = Local String
  | Global String String
  deriving (Eq, Show)

data StreamComponent r
  = STerm r
  | SNonterm r
  deriving (Eq, Show, Functor, Foldable, Traversable)

data StreamPattern
  = SPTerm Pattern
  | SPNonterm Expr Pattern
  | SPStream String
  deriving (Eq, Show)

data ExprF r
  = EIdent Ident
  | EConstant Constant
  | ETuple [r]
  | EConstruct0 String
  | EConstruct1 String r
  | EApply r [r]
  | ELet Bool [(Pattern, r)] r
  | EFunction [( [Pattern], r)]
  | EMatch r [(Pattern, r)]
  | ETry r [(Pattern, r)]
  | ESeq r r
  | EIf r r r
  | EWhile r r
  | EFor Ident r r Bool r
  | EConstraint r TypeExpr
  | EVector [r]
  | EAssign String r
  | ERecord [(String, r)]
  | ERecordAccess r String
  | ERecordUpdate r String r
  | EStream [StreamComponent r]
  | EParser [(StreamPattern, r)]
  | EWhen r r
  | EExt String [r]
  deriving (Eq, Show, Functor, Foldable, Traversable)

data Expr = Expr
  { unExpr  :: ExprF Expr
  , exprLoc :: Location
  } deriving (Eq, Show)