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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
definition module Sil.Syntax
from StdOverloaded import class toString
from Data.Maybe import :: Maybe
from Sil.Types import :: Type
from Sil.Util.Parser import :: ParsePosition, class getPos
:: Program =
{ p_funs :: [Function]
, p_globals :: [Initialisation]
}
:: Function =
{ f_type :: Type
, f_name :: Name
, f_args :: [Arg]
, f_code :: CodeBlock
, f_pos :: ParsePosition
}
:: CodeBlock =
{ cb_init :: [Initialisation]
, cb_content :: [Statement]
}
:: Arg =
{ arg_type :: Type
, arg_name :: Name
}
:: Initialisation =
{ init_type :: Type
, init_name :: Name
, init_value :: Maybe Expression
, init_pos :: ParsePosition
}
:: Statement
= Declaration ParsePosition Name Expression
| Application ParsePosition Expression
| Return ParsePosition (Maybe Expression)
| If ParsePosition [(Expression, CodeBlock)] (Maybe CodeBlock)
| While ParsePosition Expression CodeBlock
| MachineStm ParsePosition String
:: Expression
= Name ParsePosition Name
| Literal ParsePosition Literal
| App ParsePosition Name [Expression]
| BuiltinApp ParsePosition Op1 Expression
| BuiltinApp2 ParsePosition Expression Op2 Expression
| Field ParsePosition Name Expression
| Tuple ParsePosition Int [Expression]
| List ParsePosition (Maybe Type) [Expression]
:: Op1
= Neg //* ~
| Not //* !
:: Op2
= Add //* +
| Sub //* -
| Mul //* *
| Div //* /
| Rem //* %
| Equals //* ==
| Unequals //* <>
| CmpLe //* <=
| CmpGe //* >=
| CmpLt //* <
| CmpGt //* >
| LogOr //* ||
| LogAnd //* &&
| Cons //* :
:: Literal
= BLit Bool
| ILit Int
:: Name :== String
instance toString Statement
instance toString Arg
instance toString Expression
instance toString Op1
instance toString Op2
instance toString Literal
instance getPos Function
instance getPos Initialisation
instance getPos Statement
instance getPos Expression
class allStatements a :: a -> [Statement]
instance allStatements Program
instance allStatements Function
instance allStatements CodeBlock
instance allStatements Statement
class allCodeBlocks a :: a -> [CodeBlock]
instance allCodeBlocks Function
instance allCodeBlocks CodeBlock
instance allCodeBlocks Statement
class allLocals a :: a -> [(Type, Name)]
instance allLocals Function
instance allLocals CodeBlock
|