egison-4.1.0: hs-src/Language/Egison/AST.hs
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{- |
Module : Language.Egison.AST
Licence : MIT
This module defines the syntax of Egison.
-}
module Language.Egison.AST
( TopExpr (..)
, ConstantExpr (..)
, Expr (..)
, Pattern (..)
, VarWithIndices (..)
, makeApply
, Arg (..)
, ArgPattern (..)
, IndexExpr (..)
, VarIndex (..)
, PMMode (..)
, BindingExpr (..)
, MatchClause
, PatternDef
, LoopRange (..)
, PrimitivePatPattern (..)
, PDPatternBase (..)
, PrimitiveDataPattern
, Op (..)
, Assoc (..)
, reservedExprOp
, reservedPatternOp
, findOpFrom
, stringToVarWithIndices
) where
import Data.List (find)
import Data.Maybe (fromJust)
import Data.Text (Text)
data TopExpr
= Define VarWithIndices Expr
| Test Expr
| Execute Expr
-- temporary : we will replace load to import and export
| LoadFile String
| Load String
| InfixDecl Bool Op -- True for pattern infix; False for expression infix
deriving Show
data ConstantExpr
= CharExpr Char
| StringExpr Text
| BoolExpr Bool
| IntegerExpr Integer
| FloatExpr Double
| SomethingExpr
| UndefinedExpr
deriving Show
data Expr
= ConstantExpr ConstantExpr
| VarExpr String
| FreshVarExpr
| IndexedExpr Bool Expr [IndexExpr Expr] -- True -> delete old index and append new one
| SubrefsExpr Bool Expr Expr
| SuprefsExpr Bool Expr Expr
| UserrefsExpr Bool Expr Expr
| TupleExpr [Expr]
| CollectionExpr [Expr]
| ConsExpr Expr Expr
| JoinExpr Expr Expr
| HashExpr [(Expr, Expr)]
| VectorExpr [Expr]
| LambdaExpr [Arg ArgPattern] Expr
| LambdaExpr' [Arg String] Expr
| MemoizedLambdaExpr [String] Expr
| CambdaExpr String Expr
| PatternFunctionExpr [String] Pattern
| IfExpr Expr Expr Expr
| LetExpr [BindingExpr] Expr
| LetRecExpr [BindingExpr] Expr
| WithSymbolsExpr [String] Expr
| MatchExpr PMMode Expr Expr [MatchClause]
| MatchAllExpr PMMode Expr Expr [MatchClause]
| MatchLambdaExpr Expr [MatchClause]
| MatchAllLambdaExpr Expr [MatchClause]
| MatcherExpr [PatternDef]
| AlgebraicDataMatcherExpr [(String, [Expr])]
| QuoteExpr Expr
| QuoteSymbolExpr Expr
| WedgeApplyExpr Expr [Expr]
| DoExpr [BindingExpr] Expr
| PrefixExpr String Expr
| InfixExpr Op Expr Expr
| SectionExpr Op (Maybe Expr) (Maybe Expr) -- There cannot be 'SectionExpr op (Just _) (Just _)'
| SeqExpr Expr Expr
| ApplyExpr Expr [Expr]
| CApplyExpr Expr Expr
| AnonParamFuncExpr Integer Expr
| AnonParamExpr Integer
| GenerateTensorExpr Expr Expr
| TensorExpr Expr Expr
| TensorContractExpr Expr
| TensorMapExpr Expr Expr
| TensorMap2Expr Expr Expr Expr
| TransposeExpr Expr Expr
| FlipIndicesExpr Expr -- Does not appear in user program
| FunctionExpr [String]
deriving Show
data VarWithIndices = VarWithIndices String [VarIndex]
deriving Show
data Arg a
= ScalarArg a
| InvertedScalarArg a
| TensorArg a
deriving Show
data ArgPattern
= APWildCard
| APPatVar String
| APInductivePat String [Arg ArgPattern]
| APTuplePat [Arg ArgPattern]
| APEmptyPat
| APConsPat (Arg ArgPattern) (Arg ArgPattern)
| APSnocPat (Arg ArgPattern) (Arg ArgPattern)
deriving Show
data VarIndex
= VSubscript String
| VSuperscript String
| VGroupScripts [VarIndex]
| VSymmScripts [VarIndex]
| VAntiSymmScripts [VarIndex]
deriving Show
data IndexExpr a
= Subscript a
| Superscript a
| SupSubscript a
| MultiSubscript a a
| MultiSuperscript a a
| Userscript a
deriving (Show, Eq, Functor, Foldable, Traversable)
data PMMode = BFSMode | DFSMode
deriving Show
data BindingExpr
= Bind PrimitiveDataPattern Expr
| BindWithIndices VarWithIndices Expr
deriving Show
type MatchClause = (Pattern, Expr)
type PatternDef = (PrimitivePatPattern, Expr, [(PrimitiveDataPattern, Expr)])
data Pattern
= WildCard
| PatVar String
| ValuePat Expr
| PredPat Expr
| IndexedPat Pattern [Expr]
| LetPat [BindingExpr] Pattern
| InfixPat Op Pattern Pattern -- Includes AndPat,OrPat,InductivePat(cons/join)
| NotPat Pattern
| AndPat Pattern Pattern
| OrPat Pattern Pattern
| ForallPat Pattern Pattern
| TuplePat [Pattern]
| InductivePat String [Pattern]
| LoopPat String LoopRange Pattern Pattern
| ContPat
| PApplyPat Expr [Pattern]
| VarPat String
| InductiveOrPApplyPat String [Pattern]
| SeqNilPat
| SeqConsPat Pattern Pattern
| LaterPatVar
-- For symbolic computing
| DApplyPat Pattern [Pattern]
deriving Show
data LoopRange = LoopRange Expr Expr Pattern
deriving Show
data PrimitivePatPattern
= PPWildCard
| PPPatVar
| PPValuePat String
| PPInductivePat String [PrimitivePatPattern]
| PPTuplePat [PrimitivePatPattern]
deriving Show
data PDPatternBase var
= PDWildCard
| PDPatVar var
| PDInductivePat String [PDPatternBase var]
| PDTuplePat [PDPatternBase var]
| PDEmptyPat
| PDConsPat (PDPatternBase var) (PDPatternBase var)
| PDSnocPat (PDPatternBase var) (PDPatternBase var)
| PDConstantPat ConstantExpr
deriving (Functor, Foldable, Show)
type PrimitiveDataPattern = PDPatternBase String
data Op
= Op { repr :: String -- syntastic representation
, priority :: Int
, assoc :: Assoc
, isWedge :: Bool -- True if operator is prefixed with '!'. Only used for expression infix.
}
deriving (Eq, Ord, Show)
data Assoc
= InfixL
| InfixR
| InfixN
| Prefix
deriving (Eq, Ord)
instance Show Assoc where
show InfixL = "infixl"
show InfixR = "infixr"
show InfixN = "infix"
show Prefix = "prefix"
reservedExprOp :: [Op]
reservedExprOp =
[ Op "!" 8 Prefix False -- Wedge
, Op "-" 7 Prefix False -- Negate
, Op "%" 7 InfixL False -- primitive function
, Op "*$" 7 Prefix False -- For InvertedScalarArg
, Op "*$" 7 InfixL False -- For InvertedScalarArg
, Op "++" 5 InfixR False
, Op "::" 5 InfixR False
, Op "=" 4 InfixL False -- primitive function
, Op "<=" 4 InfixL False -- primitive function
, Op ">=" 4 InfixL False -- primitive function
, Op "<" 4 InfixL False -- primitive function
, Op ">" 4 InfixL False -- primitive function
]
reservedPatternOp :: [Op]
reservedPatternOp =
[ Op "::" 5 InfixR False -- cons (desugared)
, Op "++" 5 InfixR False -- join (desugared)
, Op "&" 3 InfixR False
, Op "|" 2 InfixR False
]
findOpFrom :: String -> [Op] -> Op
findOpFrom op table = fromJust $ find ((== op) . repr) table
stringToVarWithIndices :: String -> VarWithIndices
stringToVarWithIndices name = VarWithIndices name []
makeApply :: String -> [Expr] -> Expr
makeApply func args = ApplyExpr (VarExpr func) args