1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
------------------------------------------------------------------------------
--- A library to represent a subset of Julia programs.
---
--- @author Michael Hanus
--- @version June 2020
------------------------------------------------------------------------------

module Julia.Types
 where

------------------------------------------------------------------------------
--- Julia types.
data JLType = JLBoolType | JLInt32 | JLInt64 | JLFloat64 | JLStringType
            | JLStruct String
            | JLArray [JLType]

--- Julia expressions.
data JLExp = JLBool      Bool
           | JLInt       Int
           | JLFloat     Float
           | JLString    String
           | JLIVar      Int                -- indexed variable
           | JLSVar      String             -- other variable expression
           | JLArrayAcc  JLExp JLExp        -- array access to element
           | JLArrayInit [JLExp]            -- array initializer
           | JLStructAcc JLExp String       -- structure access to component
           | JLOp        String JLExp JLExp -- binary operator
           | JLFCall     String [JLExp]     -- function call

--- Julia statements.
data JLStm = JLAssign  JLExp JLExp
           | JLIf      JLExp  [JLStm] [JLStm]
           | JLWhile   JLExp  [JLStm]
           | JLFor     Int JLExp JLExp [JLStm] -- variable/lower/upper/body
           | JLPCall   String [JLExp]
           | JLReturn  JLExp

--- Julia top-level entities occurring in scripts.
--- These are function declarations or statements.
--- A function declaration consists of a name, indexed arguments
--- with optional types, an optional result type and the body
--- represented by a list of statements.
data JLTop =
    JLFDecl String [(Int, Maybe JLType)] (Maybe JLType) [JLStm]
  | JLStat  JLStm

--- Julia module consisting of the module name, exported names,
--- imported modules, and a list of top-level entities.
data JLModule = JLModule String [String] [String] [JLTop]

------------------------------------------------------------------------------