module Language.Modelica.Syntax.Modelica where
import Language.Modelica.Syntax.ToString
( ToString, toString, spaceMaybe, maybeSpace,
toCommaList, toSemiList, toSemiListSpace )
import Text.Parsec.Pos (SourcePos)
import qualified Data.List as List
import Text.Printf (printf)
import Data.Char (toLower)
type EitherOrOr a b c = Either a (Either b c)
type TypeSpecifier = Name
data Ident = Ident SourcePos String
| QIdent SourcePos String deriving (Show)
instance Eq Ident where
(Ident _ a) == (Ident _ b) = a == b
(QIdent _ a) == (QIdent _ b) = a == b
_ == _ = False
instance ToString Ident where
toString (Ident _pos str) = str
toString (QIdent _pos str) = "'" ++ str ++ "'"
data Dot = Dot deriving (Show, Eq)
instance ToString Dot where
toString = const "."
data Star = Star deriving (Show, Eq)
instance ToString Star where
toString = const "*"
data Colon = Colon deriving (Show, Eq)
instance ToString Colon where
toString = const ":"
data Each = Each deriving (Show, Eq)
instance ToString Each where
toString = const "each"
data Final = Final deriving (Show, Eq)
instance ToString Final where
toString = const "final"
data Partial = Partial deriving (Show, Eq)
instance ToString Partial where
toString = const "partial"
data Redeclare = Redeclare deriving (Show, Eq)
instance ToString Redeclare where
toString = const "redeclare"
data Inner = Inner deriving (Show, Eq)
instance ToString Inner where
toString = const "inner"
data Outer = Outer deriving (Show, Eq)
instance ToString Outer where
toString = const "outer"
data Init = Init deriving (Show, Eq)
instance ToString Init where
toString = const "initial"
data Encapsulated = Encapsulated deriving (Show, Eq)
instance ToString Encapsulated where
toString = const "encapsulated"
data Name = Name (Maybe Dot) Ident [Ident] deriving (Show, Eq)
instance ToString Name where
toString (Name dot i is) =
toString dot ++ List.intercalate "." (map toString (i:is))
data Modification =
Modification ClassModification (Maybe Expression)
| ModificationAssign Expression
| ModificationColonAssign Expression
deriving (Show, Eq)
instance ToString Modification where
toString (Modification cm ex) =
toString cm ++ maybe "" ((" = " ++) . toString) ex
toString (ModificationAssign ex) = " = " ++ toString ex
toString (ModificationColonAssign as) = " := " ++ toString as
data ClassModification = ClassModification (Maybe ArgumentList) deriving (Show, Eq)
instance ToString ClassModification where
toString (ClassModification al) = "(" ++ toString al ++ ")"
data ArgumentList =
ArgumentList Argument [Argument] deriving (Show, Eq)
instance ToString ArgumentList where
toString (ArgumentList e es) = toCommaList (e:es)
data Argument =
ArgElementModOrRep ElementModOrRep
| ArgElementRedeclaration ElementRedeclaration deriving (Show, Eq)
instance ToString Argument where
toString (ArgElementModOrRep emor) = toString emor
toString (ArgElementRedeclaration er) = toString er
data ElementModOrRep =
ElementModOrRep
(Maybe Each)
(Maybe Final)
(Either ElementModification ElementReplaceableShort) deriving (Show, Eq)
instance ToString ElementModOrRep where
toString (ElementModOrRep each final x) =
maybeSpace each ++ maybeSpace final ++ toString x
data ElementModification =
ElementModification Name (Maybe Modification) (Maybe StringComment)
deriving (Show, Eq)
instance ToString ElementModification where
toString (ElementModification n m sc) =
toString n ++ toString m ++ toString sc
data ElementRedeclaration =
ElementRedeclaration
(Maybe Each)
(Maybe Final)
(EitherOrOr ShortClassDefinition ComponentClause1 ElementReplaceableShort)
deriving (Show, Eq)
instance ToString ElementRedeclaration where
toString (ElementRedeclaration each final expr) =
"redeclare " ++ maybeSpace each ++ maybeSpace final ++ toString expr
data ElementReplaceableShort =
ElementReplaceableShort
(Either ShortClassDefinition ComponentClause1)
(Maybe ConstrainingClause)
deriving (Show, Eq)
instance ToString ElementReplaceableShort where
toString (ElementReplaceableShort oot cc) =
"replaceable " ++ toString oot ++ spaceMaybe cc
data ShortClassDefinition =
ShortClassDefinition ClassPrefixes Ident ShortClassDef deriving (Show, Eq)
instance ToString ShortClassDefinition where
toString (ShortClassDefinition pref i scd) =
toString pref ++ " " ++ toString i ++ " = " ++ toString scd
data ShortClassDef =
ShortClassDef1 (Either Colon (Maybe EnumList)) Comment
| ShortClassDef2
TypePrefix
Name
(Maybe ArraySubscripts)
(Maybe ClassModification)
Comment
deriving (Show, Eq)
instance ToString ShortClassDef where
toString (ShortClassDef1 x c) =
"enumeration (" ++ toString x ++ ")" ++ toString c
toString (ShortClassDef2 t n as cm c) =
toString t ++ toString n
++ toString as ++ spaceMaybe cm ++ toString c
data ComponentClause1 =
ComponentClause1 TypePrefix TypeSpecifier ComponentDeclaration1
deriving (Show, Eq)
instance ToString ComponentClause1 where
toString (ComponentClause1 tp n cd) =
toString tp ++ toString n ++ " " ++ toString cd
data ComponentDeclaration1 =
ComponentDeclaration1 Declaration Comment deriving (Show, Eq)
instance ToString ComponentDeclaration1 where
toString (ComponentDeclaration1 d c) =
toString d ++ toString c
data ConstrainingClause =
ConstrainingClause Name (Maybe ClassModification) deriving (Show, Eq)
instance ToString ConstrainingClause where
toString (ConstrainingClause n cm) =
"constrainedby " ++ toString n ++ spaceMaybe cm
data ExtendsClause =
ExtendsClause Name (Maybe ClassModification) (Maybe Annotation) deriving (Show, Eq)
instance ToString ExtendsClause where
toString (ExtendsClause n cm an) =
"extends " ++ toString n ++ spaceMaybe cm ++ spaceMaybe an
data Comment = Comment (Maybe StringComment) (Maybe Annotation)
deriving (Show, Eq)
instance ToString Comment where
toString (Comment sc an) = toString sc ++ spaceMaybe an
data StringComment = StringComment (Maybe (String, [String])) deriving (Show, Eq)
instance ToString StringComment where
toString (StringComment Nothing) = ""
toString (StringComment (Just (s, ss))) =
" " ++ List.intercalate " + " (map (printf "\"%s\"") (s:ss))
newtype Annotation = Annotation ClassModification deriving (Show, Eq)
instance ToString Annotation where
toString (Annotation cm) = "annotation " ++ toString cm
data Expression =
IfExpression Expression Expression [ElseIfExpression] Expression
| Expression SimpleExpression deriving (Show, Eq)
instance ToString Expression where
toString (Expression e) = toString e
toString (IfExpression cond th eie els) =
"if " ++ toString cond ++ " then " ++ toString th
++ concatMap toString eie ++ " else " ++ toString els
data ElseIfExpression = ElseIfExpression Expression Expression deriving (Show, Eq)
instance ToString ElseIfExpression where
toString (ElseIfExpression e1 e2) =
" elseif " ++ toString e1 ++ " then " ++ toString e2
data SimpleExpression =
SimpleExpression1 LogicalExpression
| SimpleExpression2 LogicalExpression LogicalExpression
| SimpleExpression3 LogicalExpression LogicalExpression LogicalExpression
deriving (Show, Eq)
instance ToString SimpleExpression where
toString (SimpleExpression1 le) = toString le
toString (SimpleExpression2 le1 le2) =
toString le1 ++ " : " ++ toString le2
toString (SimpleExpression3 le1 le2 le3) =
toString le1 ++ " : " ++ toString le2 ++ " : " ++ toString le3
data LogicalExpression =
LogicalExpression LogicalTerm [LogicalTerm] deriving (Show, Eq)
instance ToString LogicalExpression where
toString (LogicalExpression lt lts) =
toString lt ++ concatMap ((" or " ++) . toString) lts
data LogicalTerm =
LogicalTerm LogicalFactor [LogicalFactor] deriving (Show, Eq)
instance ToString LogicalTerm where
toString (LogicalTerm lf lfs) =
toString lf ++ concatMap ((" and " ++) . toString) lfs
data Not = Not deriving (Show, Eq)
data LogicalFactor = LogicalFactor (Maybe Not) Relation deriving (Show, Eq)
instance ToString LogicalFactor where
toString (LogicalFactor b rel) =
(++ toString rel) $
case b of
Just Not -> "not "
_ -> ""
data Relation =
Relation ArithmeticExpression (Maybe (RelOp, ArithmeticExpression))
deriving (Show, Eq)
instance ToString Relation where
toString (Relation ae ro) = toString ae ++ maybe "" f ro
where f (r, a) = " " ++ toString r ++ " " ++ toString a
data RelOp = Equal | UnEqual | GTH | LTH | GEQ | LEQ deriving (Show, Eq)
instance ToString RelOp where
toString Equal = "=="
toString UnEqual = "<>"
toString GTH = ">"
toString LTH = "<"
toString GEQ = ">="
toString LEQ = "<="
data ArithmeticExpression =
ArithmeticExpression (Maybe AddOp) Term [(AddOp, Term)] deriving (Show, Eq)
instance ToString ArithmeticExpression where
toString (ArithmeticExpression ao t ls) =
toString ao ++ toString t ++ concatMap f ls
where f (a, s) = " " ++ toString a ++ " " ++ toString s
data AddOp = Plus | Minus | DotPlus | DotMinus deriving (Show, Eq)
instance ToString AddOp where
toString Plus = "+"
toString Minus = "-"
toString DotPlus = ".+"
toString DotMinus = ".-"
data Term = Term Factor [(MulOp, Factor)] deriving (Show, Eq)
instance ToString Term where
toString (Term fac ls) =
toString fac ++ concatMap f ls
where f (mo, g) = " " ++ toString mo ++ " " ++ toString g
data MulOp = Mul | Div | DotMul | DotDiv deriving (Show, Eq)
instance ToString MulOp where
toString Mul = "*"
toString Div = "/"
toString DotMul = ".*"
toString DotDiv = "./"
data Factor = Factor Primary (Maybe (PotOp, Primary)) deriving (Show, Eq)
instance ToString Factor where
toString (Factor prim m) = toString prim ++ maybe "" f m
where f (po, p) = toString po ++ toString p
data PotOp = Pot | DotPot deriving (Show, Eq)
instance ToString PotOp where
toString Pot = "^"
toString DotPot = ".^"
data DIN = Der | Initial | FuncCallName Name deriving (Show, Eq)
instance ToString DIN where
toString Der = "der"
toString Initial = "initial"
toString (FuncCallName n) = toString n
data Primary =
PUnsignedNumber SourcePos Double
| PModelicaStr SourcePos String
| PBoolValue SourcePos Bool
| PFuncCall DIN FunctionCallArgs
| PCompRef ComponentReference
| PFuncArgs FunctionArguments
| POutputExprList OutputExpressionList
| PExpressionList ExpressionList [ExpressionList]
| PEnd
deriving (Show)
instance Eq Primary where
(PUnsignedNumber _ a) == (PUnsignedNumber _ b) = a == b
(PModelicaStr _ a) == (PModelicaStr _ b) = a == b
(PBoolValue _ a) == (PBoolValue _ b) = a == b
(PFuncCall u v) == (PFuncCall x y) = u == x && v == y
(PCompRef a) == (PCompRef b) = a == b
(PFuncArgs a) == (PFuncArgs b) = a == b
(POutputExprList a) == (POutputExprList b) = a == b
(PExpressionList u v) == (PExpressionList x y) = u == x && v == y
PEnd == PEnd = True
_ == _ = False
instance ToString Primary where
toString (PUnsignedNumber _pos d) = show d
toString (PModelicaStr _pos str) = printf "\"%s\"" str
toString (PBoolValue _pos b) = map toLower $ show b
toString (PFuncCall din args) = toString din ++ toString args
toString (PCompRef cr) = toString cr
toString (PFuncArgs pfa) = "{" ++ toString pfa ++ "}"
toString (POutputExprList oel) = "(" ++ toString oel ++ ")"
toString (PExpressionList el els) =
"[" ++ toString el ++ concatMap f els ++ "]"
where f = ("; " ++) . toString
toString PEnd = "end"
data NamedArguments =
NamedArguments NamedArgument [NamedArgument] deriving (Show, Eq)
instance ToString NamedArguments where
toString (NamedArguments a as) = toCommaList (a:as)
data FunctionCallArgs =
FunctionCallArgs (Maybe FunctionArguments) deriving (Show, Eq)
instance ToString FunctionCallArgs where
toString (FunctionCallArgs fca) = "(" ++ toString fca ++ ")"
data FunctionArguments =
FunctionArguments FunctionArgument (Maybe (Either FunctionArguments ForIndices))
| FANamedArguments NamedArguments
deriving (Show, Eq)
instance ToString FunctionArguments where
toString (FunctionArguments fa rs) =
toString fa ++ maybe "" f rs
where f x = case x of
Left fargs -> ", " ++ toString fargs
Right foridx -> " for " ++ toString foridx
toString (FANamedArguments nargs) = toString nargs
data FunctionArgument =
FAExpression Expression
| Function Name (Maybe NamedArguments) deriving (Show, Eq)
instance ToString FunctionArgument where
toString (FAExpression ex) = toString ex
toString (Function name nargs) =
"function " ++ toString name ++ "(" ++ toString nargs ++ ")"
data NamedArgument = NamedArgument Ident FunctionArgument deriving (Show, Eq)
instance ToString NamedArgument where
toString (NamedArgument n fa) =
toString n ++ " = " ++ toString fa
data OutputExpressionList =
OutputExpressionList [Maybe Expression] deriving (Show, Eq)
instance ToString OutputExpressionList where
toString (OutputExpressionList exs) = toCommaList exs
data ExpressionList =
ExpressionList Expression [Expression] deriving (Show, Eq)
instance ToString ExpressionList where
toString (ExpressionList e es) = toCommaList (e:es)
data Subscript =
Subscript Expression
| SubscriptColon deriving (Show, Eq)
instance ToString Subscript where
toString (Subscript ex) = toString ex
toString SubscriptColon = ":"
data ArraySubscripts = ArraySubscripts Subscript [Subscript] deriving (Show, Eq)
instance ToString ArraySubscripts where
toString (ArraySubscripts a as) = "[" ++ toCommaList (a:as) ++ "]"
data ComponentReference =
ComponentReference (Maybe Dot) Ident (Maybe ArraySubscripts)
[(Ident, Maybe ArraySubscripts)] deriving (Show, Eq)
instance ToString ComponentReference where
toString (ComponentReference dot n as lst) =
toString dot ++ toString n ++ toString as ++ concatMap f lst
where f (na, a) = "." ++ toString na ++ toString a
data ForIndices = ForIndices ForIndex [ForIndex] deriving (Show, Eq)
instance ToString ForIndices where
toString (ForIndices i is) = toCommaList (i:is)
data ForIndex = ForIndex Ident (Maybe Expression) deriving (Show, Eq)
instance ToString ForIndex where
toString (ForIndex n e) =
toString n ++ maybe "" ((" in " ++) . toString) e
data TypePrefix =
TypePrefix (Maybe FS) (Maybe DPC) (Maybe OI) deriving (Show, Eq)
type BasePrefix = TypePrefix
instance ToString TypePrefix where
toString (TypePrefix fs dpc oi) =
maybeSpace fs ++ maybeSpace dpc ++ maybeSpace oi
data FS = Flow | Stream deriving (Show, Eq)
instance ToString FS where
toString = map toLower . show
data DPC = Discrete | Parameter | Constant deriving (Show, Eq)
instance ToString DPC where
toString = map toLower . show
data OI = Output | Input deriving (Show, Eq)
instance ToString OI where
toString = map toLower . show
data ClassPrefixes =
ClassPrefixes (Maybe Partial) Prefix deriving (Show, Eq)
instance ToString ClassPrefixes where
toString (ClassPrefixes part pre) = maybeSpace part ++ toString pre
data Prefix = Class
| Model
| Block
| Type
| Package
| Operator
| Record (Maybe OperatorRecord)
| Connector (Maybe Expandable)
| FunctionPrefix (Maybe PureImpure) (Maybe OperatorFunction)
deriving (Show, Eq)
instance ToString Prefix where
toString (FunctionPrefix puim opfunc) =
maybeSpace puim ++ maybeSpace opfunc ++ "function"
toString (Record orec) = maybeSpace orec ++ "record"
toString (Connector ex) = maybeSpace ex ++ "connector"
toString pref = map toLower (show pref)
data PureImpure = Pure | Impure deriving (Show, Eq)
instance ToString PureImpure where
toString = map toLower . show
data OperatorFunction = OperatorFunction deriving (Show, Eq)
instance ToString OperatorFunction where
toString = const "operator"
data OperatorRecord = OperatorRecord deriving (Show, Eq)
instance ToString OperatorRecord where
toString = const "operator"
data Expandable = Expandable deriving (Show, Eq)
instance ToString Expandable where
toString = const "expandable"
data Declaration =
Declaration Ident (Maybe ArraySubscripts) (Maybe Modification) deriving (Show, Eq)
instance ToString Declaration where
toString (Declaration n as m) =
toString n ++ toString as ++ toString m
data ConditionAttribute =
ConditionAttribute Expression deriving (Show, Eq)
instance ToString ConditionAttribute where
toString (ConditionAttribute expr) = "if " ++ toString expr
data ComponentDeclaration =
ComponentDeclaration Declaration (Maybe ConditionAttribute) Comment deriving (Show, Eq)
instance ToString ComponentDeclaration where
toString (ComponentDeclaration decl ifex com) =
toString decl ++ spaceMaybe ifex ++ toString com
data ComponentList =
ComponentList ComponentDeclaration [ComponentDeclaration] deriving (Show, Eq)
instance ToString ComponentList where
toString (ComponentList decl decls) = toString decl ++ concatMap f decls
where f = (", " ++) . toString
data ComponentClause =
ComponentClause TypePrefix TypeSpecifier (Maybe ArraySubscripts) ComponentList
deriving (Show, Eq)
instance ToString ComponentClause where
toString (ComponentClause tp n as cl) =
toString tp ++ toString n ++ toString as ++ " " ++ toString cl
data EnumerationLiteral =
EnumerationLiteral Ident Comment deriving (Show, Eq)
instance ToString EnumerationLiteral where
toString (EnumerationLiteral i c) =
toString i ++ toString c
data EnumList =
EnumList EnumerationLiteral [EnumerationLiteral] deriving (Show, Eq)
instance ToString EnumList where
toString (EnumList e es) = toCommaList (e:es)
data EquationSection =
EquationSection (Maybe Init) [Equation] deriving (Show, Eq)
instance ToString EquationSection where
toString (EquationSection ini []) =
maybeSpace ini ++ "equation"
toString (EquationSection ini eqs) =
maybeSpace ini ++ "equation " ++ toSemiList eqs
data Equation = Equation Eqn Comment deriving (Show, Eq)
instance ToString Equation where
toString (Equation e c) = toString e ++ toString c
data Eqn =
IfEquation Expression [Equation] [ElseIfEquation] (Maybe [Equation])
| ForEquation ForIndices [Equation]
| WhenEquation Expression [Equation] [ElseWhenEquation]
| ConnectClause ComponentReference ComponentReference
| EqFunctionCall Name FunctionCallArgs
| Eqn SimpleExpression Expression deriving (Show, Eq)
instance ToString Eqn where
toString (Eqn se e) = toString se ++ " = " ++ toString e
toString (IfEquation e ieqs eie eeqs) =
"if " ++ toString e ++ " then"
++ toSemiListSpace ieqs
++ concatMap toString eie
++ case eeqs of
Nothing -> ""
Just es -> "else" ++ toSemiListSpace es
++ "end if"
toString (ForEquation fi eqs) =
"for " ++ toString fi ++ " loop" ++ toSemiListSpace eqs ++ "end for"
toString (WhenEquation e eqs ewe) =
"when " ++ toString e ++ " then"
++ toSemiListSpace eqs ++ concatMap toString ewe ++ "end when"
toString (ConnectClause a b) =
"connect(" ++ toString a ++ ", " ++ toString b ++ ")"
toString (EqFunctionCall n fca) =
toString n ++ toString fca
data ElseIfEquation =
ElseIfEquation Expression [Equation] deriving (Show, Eq)
instance ToString ElseIfEquation where
toString (ElseIfEquation e eqs) =
"elseif " ++ toString e ++ " then" ++ toSemiListSpace eqs
data ElseWhenEquation =
ElseWhenEquation Expression [Equation] deriving (Show, Eq)
instance ToString ElseWhenEquation where
toString (ElseWhenEquation e eqs) =
"elsewhen " ++ toString e ++ " then" ++ toSemiListSpace eqs
data AlgorithmSection =
AlgorithmSection (Maybe Init) [Statement] deriving (Show, Eq)
instance ToString AlgorithmSection where
toString (AlgorithmSection ini []) =
maybeSpace ini ++ "algorithm"
toString (AlgorithmSection ini eqs) =
maybeSpace ini ++ "algorithm " ++ toSemiList eqs
data Statement = Statement Stmt Comment deriving (Show, Eq)
instance ToString Statement where
toString (Statement e c) = toString e ++ toString c
data Stmt =
Break
| Return
| IfStatement Expression [Statement] [ElseIfStatement] (Maybe [Statement])
| ForStatement ForIndices [Statement]
| WhenStatement Expression [Statement] [ElseWhenStatement]
| WhileStatement Expression [Statement]
| CompRefStatement ComponentReference (Either Expression FunctionCallArgs)
| OutputListStatement OutputExpressionList ComponentReference FunctionCallArgs
deriving (Show, Eq)
instance ToString Stmt where
toString Break = "break"
toString Return = "return"
toString (IfStatement e istmts eie estmts) =
"if " ++ toString e ++ " then"
++ toSemiListSpace istmts
++ concatMap toString eie
++ case estmts of
Nothing -> ""
Just es -> "else" ++ toSemiListSpace es
++ "end if"
toString (ForStatement fi stmts) =
"for " ++ toString fi ++ " loop" ++ toSemiListSpace stmts ++ "end for"
toString (WhenStatement e stmts ewe) =
"when " ++ toString e ++ " then"
++ toSemiListSpace stmts ++ concatMap toString ewe ++ "end when"
toString (WhileStatement e stmts) =
"while " ++ toString e ++ " loop"
++ toSemiListSpace stmts ++ "end while"
toString (CompRefStatement cr (Left e)) =
toString cr ++ " := " ++ toString e
toString (CompRefStatement cr (Right fca)) =
toString cr ++ toString fca
toString (OutputListStatement oel cr fca) =
"(" ++ toString oel ++ ") := " ++ toString cr ++ toString fca
data ElseIfStatement =
ElseIfStatement Expression [Statement] deriving (Show, Eq)
instance ToString ElseIfStatement where
toString (ElseIfStatement e stmts) =
"elseif " ++ toString e ++ " then" ++ toSemiListSpace stmts
data ElseWhenStatement =
ElseWhenStatement Expression [Statement] deriving (Show, Eq)
instance ToString ElseWhenStatement where
toString (ElseWhenStatement e stmts) =
"elsewhen " ++ toString e ++ " then" ++ toSemiListSpace stmts
data ImportList =
ImportList Ident [Ident] deriving (Show, Eq)
instance ToString ImportList where
toString (ImportList i is) = toCommaList (i:is)
data Import =
Assign Ident Name
| IList Name (Maybe (Either Star ImportList)) deriving (Show, Eq)
instance ToString Import where
toString (Assign i n) = toString i ++ " = " ++ toString n
toString (IList n Nothing) = toString n
toString (IList n (Just (Left Star))) = toString n ++ ".*"
toString (IList n (Just (Right il))) = toString n ++ ".{" ++ toString il ++ "}"
data ImportClause = ImportClause Import Comment deriving (Show, Eq)
instance ToString ImportClause where
toString (ImportClause i c) =
"import " ++ toString i ++ toString c
data ElementOptions =
ElementOptions (Maybe Redeclare) (Maybe Final) (Maybe Inner) (Maybe Outer)
deriving (Show, Eq)
instance ToString ElementOptions where
toString (ElementOptions r f i o) =
maybeSpace r ++ maybeSpace f ++ maybeSpace i ++ maybeSpace o
data Element =
ElementImportClause ImportClause
| ElementExtendsClause ExtendsClause
| Element ElementOptions (Either ClassDefinition ComponentClause)
| ElementReplaceable ElementOptions (Either ClassDefinition ComponentClause)
(Maybe (ConstrainingClause, Comment))
deriving (Show, Eq)
instance ToString Element where
toString (ElementImportClause ic) = toString ic
toString (ElementExtendsClause ec) = toString ec
toString (Element opts oot) = toString opts ++ toString oot
toString (ElementReplaceable opts oot ccc) =
toString opts ++ "replaceable " ++ toString oot ++ spaceMaybe ccc
data ElementList = ElementList [Element] deriving (Show, Eq)
instance ToString ElementList where
toString (ElementList el) = toSemiList el
data ExternalFunctionCall =
ExternalFunctionCall (Maybe ComponentReference) Ident (Maybe ExpressionList)
deriving (Show, Eq)
instance ToString ExternalFunctionCall where
toString (ExternalFunctionCall (Just cr) i el) =
toString cr ++ " = " ++ toString i ++ "(" ++ toString el ++ ")"
toString (ExternalFunctionCall Nothing i el) =
toString i ++ "(" ++ toString el ++ ")"
type LanguageSpecification = String
data Composition =
Composition
ElementList
[CompositionList]
(Maybe CompositionExternal)
(Maybe Annotation)
deriving (Show, Eq)
instance ToString Composition where
toString (Composition el cls ce a) =
toString el ++ g cls ++ maybe "" toString ce ++ maybe "" f a
where f = (' ':) . (++ ";") . toString
g [] = ""
g xs = " " ++ toString xs
data CompositionList =
PublicElementList ElementList
| ProtectedElementList ElementList
| ESec EquationSection
| ASec AlgorithmSection
deriving (Show, Eq)
instance ToString [CompositionList] where
toString xs = concatMap toString xs
instance ToString CompositionList where
toString (PublicElementList (ElementList [])) = "public "
toString (PublicElementList el) = "public " ++ toString el ++ " "
toString (ProtectedElementList (ElementList [])) = "protected "
toString (ProtectedElementList el) = "protected " ++ toString el ++ " "
toString (ESec es) = toString es
toString (ASec as) = toString as
data CompositionExternal =
CompositionExternal
(Maybe LanguageSpecification)
(Maybe ExternalFunctionCall)
(Maybe Annotation)
deriving (Show, Eq)
instance ToString CompositionExternal where
toString (CompositionExternal ls efc a) =
"external" ++ maybe "" f ls ++ spaceMaybe efc ++ spaceMaybe a ++ ";"
where f = (" \"" ++) . (++"\"") . id
data ClassSpecifier =
ClassSpecifierEnd Ident StringComment Composition Ident
| ClassSpecifierA Ident BasePrefix Name
(Maybe ArraySubscripts) (Maybe ClassModification) Comment
| ClassSpecifierEnum Ident (Either Colon (Maybe EnumList)) Comment
| ClassSpecifierDer Ident (Name, Ident, [Ident]) Comment
| ClassSpecifierExtends Ident (Maybe ClassModification)
StringComment Composition Ident
deriving (Show, Eq)
instance ToString ClassSpecifier where
toString (ClassSpecifierEnd i1 sc c i2) =
toString i1 ++ toString sc ++ " " ++ toString c ++ " end " ++ toString i2
toString (ClassSpecifierA i bp n as cm c) =
toString i ++ " = " ++ toString bp ++ toString n ++ spaceMaybe as
++ spaceMaybe cm ++ " " ++ toString c
toString (ClassSpecifierEnum i x c) =
toString i ++ " = enumeration(" ++ toString x ++ ")" ++ toString c
toString (ClassSpecifierDer i (n, j, js) c) =
toString i ++ " = der(" ++ toString n ++ ", " ++ toCommaList (j:js) ++ ")"
++ toString c
toString (ClassSpecifierExtends i1 cm sc c i2) =
"extends " ++ toString i1 ++ spaceMaybe cm ++ toString sc
++ (if emptyComposition c then "" else " ")
++ toString c
++ " end " ++ toString i2
where emptyComposition (Composition (ElementList []) [] Nothing Nothing) = True
emptyComposition _ = False
data ClassDefinition =
ClassDefinition (Maybe Encapsulated) ClassPrefixes ClassSpecifier
deriving (Show, Eq)
instance ToString ClassDefinition where
toString (ClassDefinition enc cp cs) =
maybeSpace enc ++ toString cp ++ " " ++ toString cs
data StoredDefinition =
StoredDefinition (Maybe (Maybe Name)) [(Maybe Final, ClassDefinition)]
deriving (Show, Eq)
instance ToString StoredDefinition where
toString (StoredDefinition (Just n) cd) =
"within" ++ spaceMaybe n ++ "; " ++ toSemiList cd
toString (StoredDefinition _ cd) = toSemiList cd