aboutsummaryrefslogtreecommitdiff
path: root/Sil/Syntax.dcl
blob: b99153ea81cebb222ff84ff1a6da76885d9cff85 (plain) (blame)
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