{-# LANGUAGE DataKinds, DeriveDataTypeable, FlexibleContexts, FlexibleInstances, GADTs, KindSignatures, InstanceSigs,
MultiParamTypeClasses, UndecidableInstances,
ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TypeFamilies #-}
{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}
module Language.Modula2.ISO.AST where
import Control.Applicative (ZipList(ZipList, getZipList))
import Control.Monad (forM, mapM)
import Data.Coerce (coerce)
import Data.Data (Data, Typeable)
import Data.List.NonEmpty
import Data.Text (Text)
import qualified Transformation.Shallow.TH
import qualified Transformation.Deep.TH
import qualified Rank2 as Rank2
import qualified Rank2.TH
import qualified Language.Modula2.Abstract as Abstract
import qualified Language.Modula2.ISO.Abstract as ISO.Abstract
import qualified Language.Modula2.AST as Report
import Language.Modula2.Abstract (Ident)
import Language.Modula2.AST hiding (Language, Block(..), Declaration(..), Expression(..), Statement(..),
Type(..), Variant(..))
data Language = Language deriving (Typeable Language
Language -> DataType
Language -> Constr
(forall b. Data b => b -> b) -> Language -> Language
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
forall u. (forall d. Data d => d -> u) -> Language -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapT :: (forall b. Data b => b -> b) -> Language -> Language
$cgmapT :: (forall b. Data b => b -> b) -> Language -> Language
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
dataTypeOf :: Language -> DataType
$cdataTypeOf :: Language -> DataType
toConstr :: Language -> Constr
$ctoConstr :: Language -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
Data, Typeable)
instance Abstract.Wirthy Language where
type Module Language = Module Language
type Declaration Language = Declaration True Language
type Type Language = Type Language
type Statement Language = Statement Language
type Expression Language = Expression Language
type Designator Language = Designator Language
type Value Language = Value Language
type Import Language = Import Language
type FieldList Language = FieldList Language
type ProcedureHeading Language = ProcedureHeading Language
type FormalParameters Language = FormalParameters Language
type FPSection Language = FPSection Language
type Block Language = Block Language
type StatementSequence Language = StatementSequence Language
type Case Language = Case Language
type CaseLabels Language = CaseLabels Language
type ConditionalBranch Language = ConditionalBranch Language
type Element Language = Element Language
type IdentDef Language = Ident
type QualIdent Language = QualIdent Language
constantDeclaration :: forall l' (f :: * -> *) (f' :: * -> *).
IdentDef l'
-> f (ConstExpression l' l' f' f') -> Declaration Language l' f' f
constantDeclaration = forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentDef l
-> f (ConstExpression l l f' f') -> Declaration x λ l f' f
ConstantDeclaration
typeDeclaration :: forall l' (f :: * -> *) (f' :: * -> *).
IdentDef l' -> f (Type l' l' f' f') -> Declaration Language l' f' f
typeDeclaration = forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentDef l -> f (Type l l f' f') -> Declaration x λ l f' f
TypeDeclaration
variableDeclaration :: forall l' (f :: * -> *) (f' :: * -> *).
IdentList l'
-> f (Type l' l' f' f') -> Declaration Language l' f' f
variableDeclaration = forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentList l -> f (Type l l f' f') -> Declaration x λ l f' f
VariableDeclaration
procedureDeclaration :: forall (f :: * -> *) l' (f' :: * -> *).
f (ProcedureHeading l' l' f' f')
-> f (Block l' l' f' f') -> Declaration Language l' f' f
procedureDeclaration = forall (f :: * -> *) l (f' :: * -> *) λ.
f (ProcedureHeading l l f' f')
-> f (Block l l f' f') -> Declaration 'True λ l f' f
ProcedureDeclaration
formalParameters :: forall (f :: * -> *) l' (f' :: * -> *).
[f (FPSection l' l' f' f')]
-> Maybe (ReturnType l') -> FormalParameters Language l' f' f
formalParameters = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (FPSection l l f' f'))
-> Maybe (ReturnType l) -> FormalParameters λ l f' f
FormalParameters forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
fpSection :: forall (f :: * -> *) l' (f' :: * -> *).
Bool
-> [Ident] -> f (Type l' l' f' f') -> FPSection Language l' f' f
fpSection = forall λ l (f' :: * -> *) (f :: * -> *).
Bool -> [Ident] -> f (Type l l f' f') -> FPSection λ l f' f
FPSection
block :: forall (f :: * -> *) l' (f' :: * -> *).
[f (Declaration l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Block Language l' f' f
block = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Declaration l l f' f'))
-> Maybe (f (StatementSequence l l f' f')) -> Block λ l f' f
Block forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
fieldList :: forall l' (f :: * -> *) (f' :: * -> *).
NonEmpty (IdentDef l')
-> f (Type l' l' f' f') -> FieldList Language l' f' f
fieldList = forall λ l (f' :: * -> *) (f :: * -> *).
IdentList l -> f (Type l l f' f') -> FieldList λ l f' f
FieldList
pointerType :: forall (f :: * -> *) l' (f' :: * -> *).
f (Type l' l' f' f') -> Type Language l' f' f
pointerType = forall λ l (f' :: * -> *) (f :: * -> *).
f (Type l l f' f') -> Type λ l f' f
PointerType
procedureType :: forall (f :: * -> *) l' (f' :: * -> *).
Maybe (f (FormalParameters l' l' f' f')) -> Type Language l' f' f
procedureType = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (f (FormalParameters l l f' f')) -> Type λ l f' f
ProcedureType
typeReference :: forall l' (f' :: * -> *) (f :: * -> *).
QualIdent l' -> Type Language l' f' f
typeReference = forall λ l (f' :: * -> *) (f :: * -> *).
QualIdent l -> Type λ l f' f
TypeReference
assignment :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
assignment = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> f (Expression l l f' f') -> Statement λ l f' f
Assignment
caseStatement :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> [f (Case l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
caseStatement f (Expression l' l' f' f')
scrutinee [f (Case l' l' f' f')]
cases = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> ZipList (f (Case l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
CaseStatement f (Expression l' l' f' f')
scrutinee (forall a. [a] -> ZipList a
ZipList [f (Case l' l' f' f')]
cases)
emptyStatement :: forall l' (f' :: * -> *) (f :: * -> *). Statement Language l' f' f
emptyStatement = forall λ l (f' :: * -> *) (f :: * -> *). Statement λ l f' f
EmptyStatement
exitStatement :: forall l' (f' :: * -> *) (f :: * -> *). Statement Language l' f' f
exitStatement = forall λ l (f' :: * -> *) (f :: * -> *). Statement λ l f' f
Exit
ifStatement :: forall (f :: * -> *) l' (f' :: * -> *).
NonEmpty (f (ConditionalBranch l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
ifStatement (f (ConditionalBranch l' l' f' f')
branch :| [f (ConditionalBranch l' l' f' f')]
branches) = forall λ l (f' :: * -> *) (f :: * -> *).
f (ConditionalBranch l l f' f')
-> ZipList (f (ConditionalBranch l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
If f (ConditionalBranch l' l' f' f')
branch (forall a. [a] -> ZipList a
ZipList [f (ConditionalBranch l' l' f' f')]
branches)
loopStatement :: forall (f :: * -> *) l' (f' :: * -> *).
f (StatementSequence l' l' f' f') -> Statement Language l' f' f
loopStatement = forall λ l (f' :: * -> *) (f :: * -> *).
f (StatementSequence l l f' f') -> Statement λ l f' f
Loop
procedureCall :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f')
-> Maybe [f (Expression l' l' f' f')] -> Statement Language l' f' f
procedureCall f (Designator l' l' f' f')
proc Maybe [f (Expression l' l' f' f')]
args = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> Maybe (ZipList (f (Expression l l f' f'))) -> Statement λ l f' f
ProcedureCall f (Designator l' l' f' f')
proc (forall a. [a] -> ZipList a
ZipList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [f (Expression l' l' f' f')]
args)
repeatStatement :: forall (f :: * -> *) l' (f' :: * -> *).
f (StatementSequence l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
repeatStatement = forall λ l (f' :: * -> *) (f :: * -> *).
f (StatementSequence l l f' f')
-> f (Expression l l f' f') -> Statement λ l f' f
Repeat
returnStatement :: forall (f :: * -> *) l' (f' :: * -> *).
Maybe (f (Expression l' l' f' f')) -> Statement Language l' f' f
returnStatement = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (f (Expression l l f' f')) -> Statement λ l f' f
Return
whileStatement :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement Language l' f' f
whileStatement = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (StatementSequence l l f' f') -> Statement λ l f' f
While
conditionalBranch :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> ConditionalBranch Language l' f' f
conditionalBranch = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (StatementSequence l l f' f') -> ConditionalBranch λ l f' f
ConditionalBranch
caseAlternative :: forall (f :: * -> *) l' (f' :: * -> *).
NonEmpty (f (CaseLabels l' l' f' f'))
-> f (StatementSequence l' l' f' f') -> Case Language l' f' f
caseAlternative (f (CaseLabels l' l' f' f')
c :| [f (CaseLabels l' l' f' f')]
cs) = forall λ l (f' :: * -> *) (f :: * -> *).
f (CaseLabels l l f' f')
-> ZipList (f (CaseLabels l l f' f'))
-> f (StatementSequence l l f' f')
-> Case λ l f' f
Case f (CaseLabels l' l' f' f')
c (forall a. [a] -> ZipList a
ZipList [f (CaseLabels l' l' f' f')]
cs)
labelRange :: forall (f :: * -> *) l' (f' :: * -> *).
f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
labelRange = forall λ l (f' :: * -> *) (f :: * -> *).
f (ConstExpression l l f' f')
-> f (ConstExpression l l f' f') -> CaseLabels λ l f' f
LabelRange
singleLabel :: forall (f :: * -> *) l' (f' :: * -> *).
f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
singleLabel = forall λ l (f' :: * -> *) (f :: * -> *).
f (ConstExpression l l f' f') -> CaseLabels λ l f' f
SingleLabel
statementSequence :: forall (f :: * -> *) l' (f' :: * -> *).
[f (Statement l' l' f' f')] -> StatementSequence Language l' f' f
statementSequence = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Statement l l f' f')) -> StatementSequence λ l f' f
StatementSequence forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
add :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
add = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Add
subtract :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
subtract = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Subtract
and :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
and = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
And
or :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
or = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Or
divide :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
divide = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Divide
integerDivide :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
integerDivide = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
IntegerDivide
literal :: forall (f :: * -> *) l' (f' :: * -> *).
f (Value l' l' f' f') -> Expression Language l' f' f
literal = forall λ l (f' :: * -> *) (f :: * -> *).
f (Value l l f' f') -> Expression λ l f' f
Literal
modulo :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
modulo = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Modulo
multiply :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
multiply = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Multiply
functionCall :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f')
-> [f (Expression l' l' f' f')] -> Expression Language l' f' f
functionCall f (Designator l' l' f' f')
fun [f (Expression l' l' f' f')]
args = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> ZipList (f (Expression l l f' f')) -> Expression λ l f' f
FunctionCall f (Designator l' l' f' f')
fun (forall a. [a] -> ZipList a
ZipList [f (Expression l' l' f' f')]
args)
negative :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f') -> Expression Language l' f' f
negative = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Negative
positive :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f') -> Expression Language l' f' f
positive = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Positive
not :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f') -> Expression Language l' f' f
not = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Not
read :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f') -> Expression Language l' f' f
read = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Expression λ l f' f
Read
relation :: forall (f :: * -> *) l' (f' :: * -> *).
RelOp
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Expression Language l' f' f
relation = forall λ l (f' :: * -> *) (f :: * -> *).
RelOp
-> f (Expression l l f' f')
-> f (Expression l l f' f')
-> Expression λ l f' f
Relation
element :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f') -> Element Language l' f' f
element = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Element λ l f' f
Element
range :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Element Language l' f' f
range = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Element λ l f' f
Range
builtin :: forall l' (f' :: * -> *) (f :: * -> *).
Ident -> Value Language l' f' f
builtin = forall λ l (f' :: * -> *) (f :: * -> *). Ident -> Value λ l f' f
Builtin
integer :: forall l' (f' :: * -> *) (f :: * -> *).
Integer -> Value Language l' f' f
integer = forall λ l (f' :: * -> *) (f :: * -> *). Integer -> Value λ l f' f
Integer
nil :: forall l' (f' :: * -> *) (f :: * -> *). Value Language l' f' f
nil = forall λ l (f' :: * -> *) (f :: * -> *). Value λ l f' f
Nil
real :: forall l' (f' :: * -> *) (f :: * -> *).
Double -> Value Language l' f' f
real = forall λ l (f' :: * -> *) (f :: * -> *). Double -> Value λ l f' f
Real
string :: forall l' (f' :: * -> *) (f :: * -> *).
Ident -> Value Language l' f' f
string = forall λ l (f' :: * -> *) (f :: * -> *). Ident -> Value λ l f' f
String
charCode :: forall l' (f' :: * -> *) (f :: * -> *).
Int -> Value Language l' f' f
charCode = forall λ l (f' :: * -> *) (f :: * -> *). Int -> Value λ l f' f
CharCode
false :: forall l' (f' :: * -> *) (f :: * -> *). Value Language l' f' f
false = forall λ l (f' :: * -> *) (f :: * -> *). Bool -> Value λ l f' f
Boolean Bool
False
true :: forall l' (f' :: * -> *) (f :: * -> *). Value Language l' f' f
true = forall λ l (f' :: * -> *) (f :: * -> *). Bool -> Value λ l f' f
Boolean Bool
True
variable :: forall l' (f' :: * -> *) (f :: * -> *).
QualIdent l' -> Designator Language l' f' f
variable = forall λ l (f' :: * -> *) (f :: * -> *).
QualIdent l -> Designator λ l f' f
Variable
field :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f') -> Ident -> Designator Language l' f' f
field = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Ident -> Designator λ l f' f
Field
index :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f')
-> NonEmpty (f (Expression l' l' f' f'))
-> Designator Language l' f' f
index f (Designator l' l' f' f')
array (f (Expression l' l' f' f')
index :| [f (Expression l' l' f' f')]
indexes) = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> f (Expression l l f' f')
-> ZipList (f (Expression l l f' f'))
-> Designator λ l f' f
Index f (Designator l' l' f' f')
array f (Expression l' l' f' f')
index (forall a. [a] -> ZipList a
ZipList [f (Expression l' l' f' f')]
indexes)
dereference :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f') -> Designator Language l' f' f
dereference = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Designator λ l f' f
Dereference
identDef :: Ident -> IdentDef Language
identDef = forall a. a -> a
id
nonQualIdent :: Ident -> QualIdent Language
nonQualIdent = forall l. [Ident] -> Ident -> QualIdent l
QualIdent []
instance Abstract.CoWirthy Language where
type TargetClass Language = ISO.Abstract.Modula2
coDeclaration :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Declaration Language l'' f' f -> Declaration l' l'' f' f
coDeclaration (ConstantDeclaration IdentDef l''
name f (ConstExpression l'' l'' f' f')
value) = forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentDef l'
-> f (ConstExpression l' l' f' f') -> Declaration l l' f' f
Abstract.constantDeclaration IdentDef l''
name f (ConstExpression l'' l'' f' f')
value
coDeclaration (TypeDeclaration IdentDef l''
name f (Type l'' l'' f' f')
ty) = forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentDef l' -> f (Type l' l' f' f') -> Declaration l l' f' f
Abstract.typeDeclaration IdentDef l''
name f (Type l'' l'' f' f')
ty
coDeclaration (VariableDeclaration IdentList l''
name f (Type l'' l'' f' f')
ty) = forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentList l' -> f (Type l' l' f' f') -> Declaration l l' f' f
Abstract.variableDeclaration IdentList l''
name f (Type l'' l'' f' f')
ty
coDeclaration (ProcedureDeclaration f (ProcedureHeading l'' l'' f' f')
heading f (Block l'' l'' f' f')
body) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (ProcedureHeading l' l' f' f')
-> f (Block l' l' f' f') -> Declaration l l' f' f
Abstract.procedureDeclaration f (ProcedureHeading l'' l'' f' f')
heading f (Block l'' l'' f' f')
body
coDeclaration (AddressedVariableDeclaration f (AddressedIdent l'' l'' f' f')
var ZipList (f (AddressedIdent l'' l'' f' f'))
vars f (Type l'' l'' f' f')
tp) =
forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
NonEmpty (f (AddressedIdent l' l' f' f'))
-> f (Type l' l' f' f') -> Declaration l l' f' f
ISO.Abstract.addressedVariableDeclaration (f (AddressedIdent l'' l'' f' f')
var forall a. a -> [a] -> NonEmpty a
:| forall a. ZipList a -> [a]
getZipList ZipList (f (AddressedIdent l'' l'' f' f'))
vars) f (Type l'' l'' f' f')
tp
coDeclaration (ForwardProcedureDeclaration f (ProcedureHeading l'' l'' f' f')
heading) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
f (ProcedureHeading l' l' f' f') -> Declaration l l' f' f
ISO.Abstract.forwardProcedureDeclaration f (ProcedureHeading l'' l'' f' f')
heading
coDeclaration (ModuleDeclaration Ident
name Maybe (f (ConstExpression l'' l'' f' f'))
priority [Import l'']
imports Maybe (Export l'')
exports f (Block l'' l'' f' f')
body) =
forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Declaration l l' f' f
Abstract.moduleDeclaration Ident
name Maybe (f (ConstExpression l'' l'' f' f'))
priority [Import l'']
imports Maybe (Export l'')
exports f (Block l'' l'' f' f')
body
coType :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Type Language l'' f' f -> Type l' l'' f' f
coType (ArrayType ZipList (f (Type l'' l'' f' f'))
dimensions f (Type l'' l'' f' f')
itemType) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
[f (Type l' l' f' f')] -> f (Type l' l' f' f') -> Type l l' f' f
Abstract.arrayType (forall a. ZipList a -> [a]
getZipList ZipList (f (Type l'' l'' f' f'))
dimensions) f (Type l'' l'' f' f')
itemType
coType (EnumerationType IdentList l''
names) = forall l l' (f' :: * -> *) (f :: * -> *).
Modula2 l =>
IdentList l' -> Type l l' f' f
Abstract.enumeration IdentList l''
names
coType (PackedSetType f (Type l'' l'' f' f')
base) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
f (Type l' l' f' f') -> Type l l' f' f
ISO.Abstract.packedSetType f (Type l'' l'' f' f')
base
coType (PointerType f (Type l'' l'' f' f')
destination) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Type l' l' f' f') -> Type l l' f' f
Abstract.pointerType f (Type l'' l'' f' f')
destination
coType (ProcedureType Maybe (f (FormalParameters l'' l'' f' f'))
params) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
Maybe (f (FormalParameters l' l' f' f')) -> Type l l' f' f
Abstract.procedureType Maybe (f (FormalParameters l'' l'' f' f'))
params
coType (RecordType ZipList (f (FieldList l'' l'' f' f'))
fields) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
[f (FieldList l' l' f' f')] -> Type l l' f' f
Abstract.recordType (forall a. ZipList a -> [a]
getZipList ZipList (f (FieldList l'' l'' f' f'))
fields)
coType (SetType f (Type l'' l'' f' f')
itemType) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
f (Type l' l' f' f') -> Type l l' f' f
Abstract.setType f (Type l'' l'' f' f')
itemType
coType (SubrangeType Maybe (QualIdent l'')
base f (ConstExpression l'' l'' f' f')
low f (ConstExpression l'' l'' f' f')
high) = forall l l' (f :: * -> *) (f' :: * -> *).
Modula2 l =>
Maybe (QualIdent l')
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Type l l' f' f
Abstract.subRange Maybe (QualIdent l'')
base f (ConstExpression l'' l'' f' f')
low f (ConstExpression l'' l'' f' f')
high
coType (TypeReference QualIdent l''
q) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
QualIdent l' -> Type l l' f' f
Abstract.typeReference QualIdent l''
q
coStatement :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Statement Language l'' f' f -> Statement l' l'' f' f
coStatement Statement Language l'' f' f
Statement Language l'' f' f
EmptyStatement = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Statement l l' f' f
Abstract.emptyStatement
coStatement (Assignment f (Designator l'' l'' f' f')
destination f (Expression l'' l'' f' f')
expression) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> f (Expression l' l' f' f') -> Statement l l' f' f
Abstract.assignment f (Designator l'' l'' f' f')
destination f (Expression l'' l'' f' f')
expression
coStatement (ProcedureCall f (Designator l'' l'' f' f')
procedure Maybe (ZipList (f (Expression l'' l'' f' f')))
parameters) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> Maybe [f (Expression l' l' f' f')] -> Statement l l' f' f
Abstract.procedureCall f (Designator l'' l'' f' f')
procedure forall a b. (a -> b) -> a -> b
$ forall a. ZipList a -> [a]
getZipList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (ZipList (f (Expression l'' l'' f' f')))
parameters
coStatement (If f (ConditionalBranch l'' l'' f' f')
branch ZipList (f (ConditionalBranch l'' l'' f' f'))
elsifs Maybe (f (StatementSequence l'' l'' f' f'))
fallback) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
NonEmpty (f (ConditionalBranch l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f')) -> Statement l l' f' f
Abstract.ifStatement (f (ConditionalBranch l'' l'' f' f')
branch forall a. a -> [a] -> NonEmpty a
:| forall a. ZipList a -> [a]
getZipList ZipList (f (ConditionalBranch l'' l'' f' f'))
elsifs) Maybe (f (StatementSequence l'' l'' f' f'))
fallback
coStatement (CaseStatement f (Expression l'' l'' f' f')
scrutinee ZipList (f (Case l'' l'' f' f'))
cases Maybe (f (StatementSequence l'' l'' f' f'))
fallback) =
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> [f (Case l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement l l' f' f
Abstract.caseStatement f (Expression l'' l'' f' f')
scrutinee (forall a. ZipList a -> [a]
getZipList ZipList (f (Case l'' l'' f' f'))
cases) Maybe (f (StatementSequence l'' l'' f' f'))
fallback
coStatement (While f (Expression l'' l'' f' f')
condition f (StatementSequence l'' l'' f' f')
body) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement l l' f' f
Abstract.whileStatement f (Expression l'' l'' f' f')
condition f (StatementSequence l'' l'' f' f')
body
coStatement (Repeat f (StatementSequence l'' l'' f' f')
body f (Expression l'' l'' f' f')
condition) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (StatementSequence l' l' f' f')
-> f (Expression l' l' f' f') -> Statement l l' f' f
Abstract.repeatStatement f (StatementSequence l'' l'' f' f')
body f (Expression l'' l'' f' f')
condition
coStatement (Loop f (StatementSequence l'' l'' f' f')
body) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (StatementSequence l' l' f' f') -> Statement l l' f' f
Abstract.loopStatement f (StatementSequence l'' l'' f' f')
body
coStatement (With f (Designator l'' l'' f' f')
designator f (StatementSequence l'' l'' f' f')
body) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
f (Designator l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement l l' f' f
Abstract.withStatement f (Designator l'' l'' f' f')
designator f (StatementSequence l'' l'' f' f')
body
coStatement Statement Language l'' f' f
Statement Language l'' f' f
Exit = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Statement l l' f' f
Abstract.exitStatement
coStatement (Return Maybe (f (Expression l'' l'' f' f'))
result) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
Maybe (f (Expression l' l' f' f')) -> Statement l l' f' f
Abstract.returnStatement Maybe (f (Expression l'' l'' f' f'))
result
coStatement (For Ident
index f (Expression l'' l'' f' f')
from f (Expression l'' l'' f' f')
to Maybe (f (Expression l'' l'' f' f'))
by f (StatementSequence l'' l'' f' f')
body) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
Ident
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Statement l l' f' f
Abstract.forStatement Ident
index f (Expression l'' l'' f' f')
from f (Expression l'' l'' f' f')
to Maybe (f (Expression l'' l'' f' f'))
by f (StatementSequence l'' l'' f' f')
body
coStatement Statement Language l'' f' f
Statement Language l'' f' f
RetryStatement = forall l l' (f' :: * -> *) (f :: * -> *).
Modula2 l =>
Statement l l' f' f
ISO.Abstract.retryStatement
coExpression :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Expression Language l'' f' f -> Expression l' l'' f' f
coExpression (Relation RelOp
op f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
RelOp
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Expression l l' f' f
Abstract.relation RelOp
op f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Positive f (Expression l'' l'' f' f')
e) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.positive f (Expression l'' l'' f' f')
e
coExpression (Negative f (Expression l'' l'' f' f')
e) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.negative f (Expression l'' l'' f' f')
e
coExpression (Add f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.add f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Subtract f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.subtract f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Or f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.or f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Multiply f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.multiply f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Divide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.divide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (IntegerDivide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.integerDivide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Modulo f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.modulo f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (And f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.and f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Literal f (Value l'' l'' f' f')
value) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Value l' l' f' f') -> Expression l l' f' f
Abstract.literal f (Value l'' l'' f' f')
value
coExpression (Read f (Designator l'' l'' f' f')
var) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Expression l l' f' f
Abstract.read f (Designator l'' l'' f' f')
var
coExpression (FunctionCall f (Designator l'' l'' f' f')
function ZipList (f (Expression l'' l'' f' f'))
parameters) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> [f (Expression l' l' f' f')] -> Expression l l' f' f
Abstract.functionCall f (Designator l'' l'' f' f')
function forall a b. (a -> b) -> a -> b
$ forall a. ZipList a -> [a]
getZipList ZipList (f (Expression l'' l'' f' f'))
parameters
coExpression (Not f (Expression l'' l'' f' f')
e) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.not f (Expression l'' l'' f' f')
e
coExpression (Set Maybe (QualIdent l'')
itemType ZipList (f (Element l'' l'' f' f'))
elements) = forall l l' (f :: * -> *) (f' :: * -> *).
Modula2 l =>
Maybe (QualIdent l')
-> [f (Element l' l' f' f')] -> Expression l l' f' f
Abstract.set Maybe (QualIdent l'')
itemType (forall a. ZipList a -> [a]
getZipList ZipList (f (Element l'' l'' f' f'))
elements)
coExpression (Remainder f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right) = forall l (f :: * -> *) l' (f' :: * -> *).
Modula2 l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
ISO.Abstract.remainder f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
coExpression (Array Maybe (QualIdent l'')
itemType [f (Item l'' l'' f' f')]
items) = forall l l' (f :: * -> *) (f' :: * -> *).
Modula2 l =>
Maybe (QualIdent l')
-> [f (Item l' l' f' f')] -> Expression l l' f' f
ISO.Abstract.array Maybe (QualIdent l'')
itemType [f (Item l'' l'' f' f')]
items
coExpression (Record Maybe (QualIdent l'')
tp [f (Expression l'' l'' f' f')]
fields) = forall l l' (f :: * -> *) (f' :: * -> *).
Modula2 l =>
Maybe (QualIdent l')
-> [f (Expression l' l' f' f')] -> Expression l l' f' f
ISO.Abstract.record Maybe (QualIdent l'')
tp [f (Expression l'' l'' f' f')]
fields
coValue :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Value Language l'' f' f -> Value l' l'' f' f
coValue Value Language l'' f' f
Value Language l'' f' f
Nil = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.nil
coValue (Boolean Bool
False) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.false
coValue (Boolean Bool
True) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.true
coValue (Builtin Ident
name) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Ident -> Value l l' f' f
Abstract.builtin Ident
name
coValue (Integer Integer
n) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Integer -> Value l l' f' f
Abstract.integer Integer
n
coValue (Real Double
r) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Double -> Value l l' f' f
Abstract.real Double
r
coValue (String Ident
s) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Ident -> Value l l' f' f
Abstract.string Ident
s
coValue (CharCode Int
c) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Int -> Value l l' f' f
Abstract.charCode Int
c
coDesignator :: forall l' l'' (f' :: * -> *) (f :: * -> *).
TargetClass Language l' =>
Designator Language l'' f' f -> Designator l' l'' f' f
coDesignator (Variable QualIdent l''
q) = forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
QualIdent l' -> Designator l l' f' f
Abstract.variable QualIdent l''
q
coDesignator (Field f (Designator l'' l'' f' f')
record Ident
name) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Ident -> Designator l l' f' f
Abstract.field f (Designator l'' l'' f' f')
record Ident
name
coDesignator (Index f (Designator l'' l'' f' f')
array f (Expression l'' l'' f' f')
index ZipList (f (Expression l'' l'' f' f'))
indexes) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> NonEmpty (f (Expression l' l' f' f')) -> Designator l l' f' f
Abstract.index f (Designator l'' l'' f' f')
array (f (Expression l'' l'' f' f')
index forall a. a -> [a] -> NonEmpty a
:| forall a. ZipList a -> [a]
getZipList ZipList (f (Expression l'' l'' f' f'))
indexes)
coDesignator (Dereference f (Designator l'' l'' f' f')
pointer) = forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Designator l l' f' f
Abstract.dereference f (Designator l'' l'' f' f')
pointer
instance Abstract.Nameable Language where
getProcedureName :: forall l' (f' :: * -> *) (f :: * -> *).
Nameable l' =>
ProcedureHeading Language l' f' f -> Ident
getProcedureName (ProcedureHeading Ident
name Maybe (f (FormalParameters l' l' f' f'))
_) = Ident
name
getIdentDefName :: IdentDef Language -> Ident
getIdentDefName = forall a. a -> a
id
getNonQualIdentName :: QualIdent Language -> Maybe Ident
getNonQualIdentName (QualIdent [] Ident
name) = forall a. a -> Maybe a
Just Ident
name
getNonQualIdentName QualIdent Language
_ = forall a. Maybe a
Nothing
instance Abstract.Modula2 Language where
type Export Language = Export Language
type Definition Language = Declaration False Language
type Variant Language = Variant Language
definitionModule :: forall l' (f :: * -> *) (f' :: * -> *).
Ident
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Module Language l' f' f
definitionModule Ident
name [Import l']
imports Maybe (Export l')
exports [f (Definition l' l' f' f')]
definitions = forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> [Import l]
-> Maybe (Export l)
-> ZipList (f (Definition l l f' f'))
-> Module λ l f' f
DefinitionModule Ident
name [Import l']
imports Maybe (Export l')
exports (forall a. [a] -> ZipList a
ZipList [f (Definition l' l' f' f')]
definitions)
implementationModule :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Module Language l' f' f
implementationModule = forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> Maybe (f (Priority l l f' f'))
-> [Import l]
-> f (Block l l f' f')
-> Module λ l f' f
ImplementationModule
programModule :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Module Language l' f' f
programModule = forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> Maybe (f (Priority l l f' f'))
-> [Import l]
-> f (Block l l f' f')
-> Module λ l f' f
ProgramModule
moduleExport :: Bool -> NonEmpty Ident -> Export Language
moduleExport = forall λ. Bool -> NonEmpty Ident -> Export λ
Export
moduleImport :: Maybe Ident -> NonEmpty Ident -> Import Language
moduleImport = forall λ. Maybe Ident -> NonEmpty Ident -> Import λ
Import
constantDefinition :: forall l' (f :: * -> *) (f' :: * -> *).
IdentDef l'
-> f (ConstExpression l' l' f' f') -> Definition Language l' f' f
constantDefinition = forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentDef l
-> f (ConstExpression l l f' f') -> Declaration x λ l f' f
ConstantDeclaration
typeDefinition :: forall l' (f :: * -> *) (f' :: * -> *).
IdentDef l'
-> Maybe (f (Type l' l' f' f')) -> Definition Language l' f' f
typeDefinition = \IdentDef l'
name-> forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall l λ (f' :: * -> *) (f :: * -> *).
IdentDef l -> Declaration 'False λ l f' f
OpaqueTypeDeclaration IdentDef l'
name) (forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentDef l -> f (Type l l f' f') -> Declaration x λ l f' f
TypeDeclaration IdentDef l'
name)
variableDefinition :: forall l' (f :: * -> *) (f' :: * -> *).
IdentList l' -> f (Type l' l' f' f') -> Definition Language l' f' f
variableDefinition = forall l (f :: * -> *) (f' :: * -> *) (x :: Bool) λ.
IdentList l -> f (Type l l f' f') -> Declaration x λ l f' f
VariableDeclaration
procedureDefinition :: forall (f :: * -> *) l' (f' :: * -> *).
f (ProcedureHeading l' l' f' f') -> Definition Language l' f' f
procedureDefinition = forall (f :: * -> *) l (f' :: * -> *) λ.
f (ProcedureHeading l l f' f') -> Declaration 'False λ l f' f
ProcedureDefinition
moduleDeclaration :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Declaration Language l' f' f
moduleDeclaration = forall (f :: * -> *) l (f' :: * -> *) λ.
Ident
-> Maybe (f (Priority l l f' f'))
-> [Import l]
-> Maybe (Export l)
-> f (Block l l f' f')
-> Declaration 'True λ l f' f
ModuleDeclaration
arrayType :: forall (f :: * -> *) l' (f' :: * -> *).
[f (Type l' l' f' f')]
-> f (Type l' l' f' f') -> Type Language l' f' f
arrayType = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Type l l f' f')) -> f (Type l l f' f') -> Type λ l f' f
ArrayType forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
recordType :: forall (f :: * -> *) l' (f' :: * -> *).
[f (FieldList l' l' f' f')] -> Type Language l' f' f
recordType = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (FieldList l l f' f')) -> Type λ l f' f
RecordType forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
procedureHeading :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading Language l' f' f
procedureHeading = forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> Maybe (f (FormalParameters l l f' f'))
-> ProcedureHeading λ l f' f
ProcedureHeading
caseFieldList :: forall l' (f :: * -> *) (f' :: * -> *).
Maybe Ident
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> FieldList Language l' f' f
caseFieldList Maybe Ident
n QualIdent l'
t (f (Variant l' l' f' f')
variant :| [f (Variant l' l' f' f')]
variants) [f (FieldList l' l' f' f')]
fallback = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe Ident
-> QualIdent l
-> f (Variant l l f' f')
-> ZipList (f (Variant l l f' f'))
-> ZipList (f (FieldList l l f' f'))
-> FieldList λ l f' f
CaseFieldList Maybe Ident
n QualIdent l'
t f (Variant l' l' f' f')
variant (forall a. [a] -> ZipList a
ZipList [f (Variant l' l' f' f')]
variants) (forall a. [a] -> ZipList a
ZipList [f (FieldList l' l' f' f')]
fallback)
variant :: forall (f :: * -> *) l' (f' :: * -> *).
NonEmpty (f (CaseLabels l' l' f' f'))
-> [f (FieldList l' l' f' f')] -> Variant Language l' f' f
variant (f (CaseLabels l' l' f' f')
case1 :| [f (CaseLabels l' l' f' f')]
cases) [f (FieldList l' l' f' f')]
fields = forall λ l (f' :: * -> *) (f :: * -> *).
f (CaseLabels l l f' f')
-> ZipList (f (CaseLabels l l f' f'))
-> ZipList (f (FieldList l l f' f'))
-> Variant λ l f' f
Variant f (CaseLabels l' l' f' f')
case1 (forall a. [a] -> ZipList a
ZipList [f (CaseLabels l' l' f' f')]
cases) (forall a. [a] -> ZipList a
ZipList [f (FieldList l' l' f' f')]
fields)
forStatement :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Statement Language l' f' f
forStatement = forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> f (Expression l l f' f')
-> f (Expression l l f' f')
-> Maybe (f (Expression l l f' f'))
-> f (StatementSequence l l f' f')
-> Statement λ l f' f
For
withStatement :: forall (f :: * -> *) l' (f' :: * -> *).
f (Designator l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement Language l' f' f
withStatement = forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> f (StatementSequence l l f' f') -> Statement λ l f' f
With
enumeration :: forall l' (f' :: * -> *) (f :: * -> *).
IdentList l' -> Type Language l' f' f
enumeration = forall λ l (f' :: * -> *) (f :: * -> *).
IdentList l -> Type λ l f' f
EnumerationType
subRange :: forall l' (f :: * -> *) (f' :: * -> *).
Maybe (QualIdent l')
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Type Language l' f' f
subRange = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (QualIdent l)
-> f (ConstExpression l l f' f')
-> f (ConstExpression l l f' f')
-> Type λ l f' f
SubrangeType
setType :: forall (f :: * -> *) l' (f' :: * -> *).
f (Type l' l' f' f') -> Type Language l' f' f
setType = forall λ l (f' :: * -> *) (f :: * -> *).
f (Type l l f' f') -> Type λ l f' f
SetType
set :: forall l' (f :: * -> *) (f' :: * -> *).
Maybe (QualIdent l')
-> [f (Element l' l' f' f')] -> Expression Language l' f' f
set Maybe (QualIdent l')
memberType [f (Element l' l' f' f')]
members = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (QualIdent l)
-> ZipList (f (Element l l f' f')) -> Expression λ l f' f
Set Maybe (QualIdent l')
memberType (forall a. [a] -> ZipList a
ZipList [f (Element l' l' f' f')]
members)
qualIdent :: [Ident] -> Ident -> QualIdent Language
qualIdent = forall l. [Ident] -> Ident -> QualIdent l
QualIdent
instance ISO.Abstract.Modula2 Language where
type AddressedIdent Language = AddressedIdent Language
type Item Language = Item Language
emptyVariant :: forall l' (f' :: * -> *) (f :: * -> *). Variant Language l' f' f
emptyVariant = forall λ l (f' :: * -> *) (f :: * -> *). Variant λ l f' f
EmptyVariant
addressedVariableDeclaration :: forall (f :: * -> *) l' (f' :: * -> *).
NonEmpty (f (AddressedIdent l' l' f' f'))
-> f (Type l' l' f' f') -> Declaration Language l' f' f
addressedVariableDeclaration (f (AddressedIdent l' l' f' f')
var :| [f (AddressedIdent l' l' f' f')]
vars) = forall (f :: * -> *) l (f' :: * -> *) λ.
f (AddressedIdent l l f' f')
-> ZipList (f (AddressedIdent l l f' f'))
-> f (Type l l f' f')
-> Declaration 'True λ l f' f
AddressedVariableDeclaration f (AddressedIdent l' l' f' f')
var (forall a. [a] -> ZipList a
ZipList [f (AddressedIdent l' l' f' f')]
vars)
forwardProcedureDeclaration :: forall (f :: * -> *) l' (f' :: * -> *).
f (ProcedureHeading l' l' f' f') -> Declaration Language l' f' f
forwardProcedureDeclaration = forall (f :: * -> *) l (f' :: * -> *) λ.
f (ProcedureHeading l l f' f') -> Declaration 'True λ l f' f
ForwardProcedureDeclaration
exceptionHandlingBlock :: forall (f :: * -> *) l' (f' :: * -> *).
[f (Declaration l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Block Language l' f' f
exceptionHandlingBlock = forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Declaration l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Block λ l f' f
ExceptionHandlingBlock forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> ZipList a
ZipList
addressedIdent :: forall (f :: * -> *) l' (f' :: * -> *).
Ident
-> f (ConstExpression l' l' f' f')
-> AddressedIdent Language l' f' f
addressedIdent = forall λ l (f' :: * -> *) (f :: * -> *).
Ident -> f (ConstExpression l l f' f') -> AddressedIdent λ l f' f
AddressedIdent
unaddressedIdent :: forall l' (f' :: * -> *) (f :: * -> *).
Ident -> AddressedIdent Language l' f' f
unaddressedIdent = forall λ l (f' :: * -> *) (f :: * -> *).
Ident -> AddressedIdent λ l f' f
UnaddressedIdent
packedSetType :: forall (f :: * -> *) l' (f' :: * -> *).
f (Type l' l' f' f') -> Type Language l' f' f
packedSetType = forall λ l (f' :: * -> *) (f :: * -> *).
f (Type l l f' f') -> Type λ l f' f
PackedSetType
retryStatement :: forall l' (f' :: * -> *) (f :: * -> *). Statement Language l' f' f
retryStatement = forall λ l (f' :: * -> *) (f :: * -> *). Statement λ l f' f
RetryStatement
array :: forall l' (f :: * -> *) (f' :: * -> *).
Maybe (QualIdent l')
-> [f (Item l' l' f' f')] -> Expression Language l' f' f
array = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (QualIdent l) -> [f (Item l l f' f')] -> Expression λ l f' f
Array
record :: forall l' (f :: * -> *) (f' :: * -> *).
Maybe (QualIdent l')
-> [f (Expression l' l' f' f')] -> Expression Language l' f' f
record = forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (QualIdent l)
-> [f (Expression l l f' f')] -> Expression λ l f' f
Record
remainder :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
remainder = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Remainder
single :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f') -> Item Language l' f' f
single = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Item λ l f' f
Single
repeated :: forall (f :: * -> *) l' (f' :: * -> *).
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Item Language l' f' f
repeated = forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Item λ l f' f
Repeated
data Declaration (full :: Bool) λ l (f' :: * -> *) (f :: * -> *) where
ConstantDeclaration :: Abstract.IdentDef l -> f (Abstract.ConstExpression l l f' f') -> Declaration x λ l f' f
TypeDeclaration :: Abstract.IdentDef l -> f (Abstract.Type l l f' f') -> Declaration x λ l f' f
OpaqueTypeDeclaration :: Abstract.IdentDef l -> Declaration False λ l f' f
VariableDeclaration :: Abstract.IdentList l -> f (Abstract.Type l l f' f') -> Declaration x λ l f' f
AddressedVariableDeclaration :: f (ISO.Abstract.AddressedIdent l l f' f')
-> ZipList (f (ISO.Abstract.AddressedIdent l l f' f'))
-> f (Abstract.Type l l f' f')
-> Declaration True λ l f' f
ProcedureDeclaration :: f (Abstract.ProcedureHeading l l f' f') -> f (Abstract.Block l l f' f')
-> Declaration True λ l f' f
ProcedureDefinition :: f (Abstract.ProcedureHeading l l f' f') -> Declaration False λ l f' f
ForwardProcedureDeclaration :: f (Abstract.ProcedureHeading l l f' f') -> Declaration True λ l f' f
ModuleDeclaration :: Ident -> Maybe (f (Abstract.Priority l l f' f')) -> [Abstract.Import l]
-> Maybe (Abstract.Export l) -> f (Abstract.Block l l f' f') -> Declaration True λ l f' f
deriving instance (Show (Abstract.Export l), Show (Abstract.Import l), Show (f (ISO.Abstract.AddressedIdent l l f' f')),
Show (f (Abstract.Type l l f' f')), Show (f (Abstract.ConstExpression l l f' f')),
Show (f (Abstract.FormalParameters l l f' f')), Show (f (Abstract.ProcedureHeading l l f' f')),
Show (f (Abstract.Block l l f' f')), Show (f (Abstract.Block l l f' f')),
Show (Abstract.IdentDef l)) => Show (Declaration x λ l f' f)
data AddressedIdent λ l f' f = AddressedIdent Ident (f (Abstract.ConstExpression l l f' f'))
| UnaddressedIdent Ident
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
Data (f (Abstract.ConstExpression l l f' f'))) => Data (AddressedIdent λ l f' f)
deriving instance (Show (f (Abstract.ConstExpression l l f' f'))) => Show (AddressedIdent λ l f' f)
data Type λ l f' f = TypeReference (Abstract.QualIdent l)
| ArrayType (ZipList (f (Abstract.Type l l f' f'))) (f (Abstract.Type l l f' f'))
| EnumerationType (Abstract.IdentList l)
| SubrangeType (Maybe (Abstract.QualIdent l))
(f (Abstract.ConstExpression l l f' f')) (f (Abstract.ConstExpression l l f' f'))
| SetType (f (Abstract.Type l l f' f'))
| PackedSetType (f (Abstract.Type l l f' f'))
| RecordType (ZipList (f (Abstract.FieldList l l f' f')))
| PointerType (f (Abstract.Type l l f' f'))
| ProcedureType (Maybe (f (Abstract.FormalParameters l l f' f')))
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
Data (Abstract.QualIdent l), Data (Abstract.IdentList l),
Data (f (Abstract.Type l l f' f')), Data (f (Abstract.ConstExpression l l f' f')),
Data (f (Abstract.FormalParameters l l f' f')), Data (f (Abstract.FieldList l l f' f'))) =>
Data (Type λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (Abstract.IdentList l), Show (f (Abstract.Type l l f' f')),
Show (f (Abstract.ConstExpression l l f' f')), Show (f (Abstract.FormalParameters l l f' f')),
Show (f (Abstract.FieldList l l f' f'))) =>
Show (Type λ l f' f)
data Expression λ l f' f = Relation RelOp (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Positive (f (Abstract.Expression l l f' f'))
| Negative (f (Abstract.Expression l l f' f'))
| Add (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Subtract (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Or (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Multiply (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Divide (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| IntegerDivide (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Modulo (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Remainder (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| And (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
| Array (Maybe (Abstract.QualIdent l)) [f (ISO.Abstract.Item l l f' f')]
| Record (Maybe (Abstract.QualIdent l)) [f (Abstract.Expression l l f' f')]
| Set (Maybe (Abstract.QualIdent l)) (ZipList (f (Abstract.Element l l f' f')))
| Read (f (Abstract.Designator l l f' f'))
| FunctionCall (f (Abstract.Designator l l f' f')) (ZipList (f (Abstract.Expression l l f' f')))
| Not (f (Abstract.Expression l l f' f'))
| Literal (f (Abstract.Value l l f' f'))
data Item λ l f' f = Single (f (Abstract.Expression l l f' f'))
| Repeated (f (Abstract.Expression l l f' f')) (f (Abstract.ConstExpression l l f' f'))
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.QualIdent l),
Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Element l l f' f')),
Data (f (ISO.Abstract.Item l l f' f')), Data (f (Abstract.Value l l f' f')),
Data (f (Abstract.Expression l l f' f'))) =>
Data (Expression λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (f (Abstract.Designator l l f' f')),
Show (f (Abstract.Element l l f' f')), Show (f (ISO.Abstract.Item l l f' f')),
Show (f (Abstract.Value l l f' f')), Show (f (Abstract.Expression l l f' f'))) => Show (Expression λ l f' f)
deriving instance (Eq (Abstract.QualIdent l), Eq (f (Abstract.Designator l l f' f')),
Eq (f (Abstract.Element l l f' f')), Eq (f (ISO.Abstract.Item l l f' f')),
Eq (f (Abstract.Value l l f' f')), Eq (f (Abstract.Expression l l f' f'))) => Eq (Expression λ l f' f)
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Expression l l f' f')),
Data (f (Abstract.Expression l l f' f'))) =>
Data (Item λ l f' f)
deriving instance (Show (f (Abstract.Expression l l f' f'))) => Show (Item λ l f' f)
deriving instance (Eq (f (Abstract.Expression l l f' f'))) => Eq (Item λ l f' f)
data Variant λ l f' f =
Variant (f (Abstract.CaseLabels l l f' f')) (ZipList (f (Abstract.CaseLabels l l f' f')))
(ZipList (f (Abstract.FieldList l l f' f')))
| EmptyVariant
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.CaseLabels l l f' f')),
Data (f (Abstract.FieldList l l f' f'))) => Data (Variant λ l f' f)
deriving instance (Show (f (Abstract.CaseLabels l l f' f')), Show (f (Abstract.FieldList l l f' f')))
=> Show (Variant λ l f' f)
data Block λ l f' f = Block (ZipList (f (Abstract.Declaration l l f' f'))) (Maybe (f (Abstract.StatementSequence l l f' f')))
| ExceptionHandlingBlock (ZipList (f (Abstract.Declaration l l f' f')))
(Maybe (f (Abstract.StatementSequence l l f' f')))
(Maybe (f (Abstract.StatementSequence l l f' f')))
(Maybe (f (Abstract.StatementSequence l l f' f')))
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Declaration l l f' f')),
Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Expression l l f' f')),
Data (f (Abstract.StatementSequence l l f' f'))) =>
Data (Block λ l f' f)
deriving instance (Show (f (Abstract.Declaration l l f' f')), Show (f (Abstract.Designator l l f' f')),
Show (f (Abstract.Expression l l f' f')), Show (f (Abstract.StatementSequence l l f' f'))) =>
Show (Block λ l f' f)
data Statement λ l f' f = EmptyStatement
| Assignment (f (Abstract.Designator l l f' f')) (f (Abstract.Expression l l f' f'))
| ProcedureCall (f (Abstract.Designator l l f' f')) (Maybe (ZipList (f (Abstract.Expression l l f' f'))))
| If (f (Abstract.ConditionalBranch l l f' f'))
(ZipList (f (Abstract.ConditionalBranch l l f' f')))
(Maybe (f (Abstract.StatementSequence l l f' f')))
| CaseStatement (f (Abstract.Expression l l f' f'))
(ZipList (f (Abstract.Case l l f' f')))
(Maybe (f (Abstract.StatementSequence l l f' f')))
| While (f (Abstract.Expression l l f' f')) (f (Abstract.StatementSequence l l f' f'))
| Repeat (f (Abstract.StatementSequence l l f' f')) (f (Abstract.Expression l l f' f'))
| For Ident (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
(Maybe (f (Abstract.Expression l l f' f'))) (f (Abstract.StatementSequence l l f' f'))
| Loop (f (Abstract.StatementSequence l l f' f'))
| With (f (Abstract.Designator l l f' f')) (f (Abstract.StatementSequence l l f' f'))
| Exit
| Return (Maybe (f (Abstract.Expression l l f' f')))
| RetryStatement
deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Expression l l f' f')),
Data (f (Abstract.Case l l f' f')), Data (f (Abstract.ConditionalBranch l l f' f')),
Data (f (Abstract.StatementSequence l l f' f'))) => Data (Statement λ l f' f)
deriving instance (Show (f (Abstract.Designator l l f' f')), Show (f (Abstract.Expression l l f' f')),
Show (f (Abstract.Case l l f' f')), Show (f (Abstract.ConditionalBranch l l f' f')),
Show (f (Abstract.StatementSequence l l f' f'))) => Show (Statement λ l f' f)
$(concat <$>
(forM [Rank2.TH.deriveFunctor, Rank2.TH.deriveFoldable, Rank2.TH.deriveTraversable,
Transformation.Shallow.TH.deriveAll, Transformation.Deep.TH.deriveAll] $
\derive-> mconcat <$> mapM derive
[''AddressedIdent, ''Block, ''Declaration, ''Expression, ''Item, ''Statement, ''Type, ''Variant]))
$(mconcat <$> mapM Rank2.TH.unsafeDeriveApply
[''AddressedIdent, ''Block, ''Declaration, ''Type, ''Statement, ''Expression, ''Item, ''Variant])