b688b8c6b1ca9d2d0c1f9295ed31a2c95c83a830
[barrelfish] / tools / sockeye / Backend.lhs
1 %include polycode.fmt
2
3 %if false
4   Sockeye: an even more simpler IDL for Barrelfish
5    
6   Copyright (c) 2015 ETH Zurich.
7   All rights reserved.
8   
9   This file is distributed under the terms in the attached LICENSE file.
10   If you do not find this file, copies can be found by writing to:
11   ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. 
12   Attn: Systems Group.
13 %endif
14
15 \section{General Functions for Back-ends}
16
17
18 In this module, we define some general functions. These functions are
19 used in both Code and Header back-ends. They are quite simple, so we
20 can afford to present them out of their context.
21
22
23 > module Backend where
24
25 %if false
26
27 > import Data.List
28
29 > import SockeyeSyntax
30
31 %endif
32
33
34
35 \subsection{The Preamble}
36
37 In both cases, we will have to emit a long, tedious copyright
38 notice. So, here it is done once and for all.
39
40 > preamble :: Schema -> String -> String
41 > preamble schema filename =
42 >     let name = 
43 >             case schema of
44 >                    Schema _ desc _ -> desc
45 >                    _ -> ""
46 >     in
47 >     {-" \mbox{and so on\ldots} "-}
48
49 %if false
50
51 >     "/*\n * Schema Definition: " ++ name ++ "\n\
52 >     \ * Generated from: " ++ filename ++ "\n\
53 >     \ * \n\
54 >     \ * Copyright (c) 2015, ETH Zurich.\n\
55 >     \ * All rights reserved.\n\
56 >     \ * \n\
57 >     \ * This file is distributed under the terms in the attached LICENSE\n\
58 >     \ * file. If you do not find this file, copies can be found by\n\
59 >     \ * writing to:\n\
60 >     \ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich.\n\
61 >     \ *  Attn: Systems Group.\n\
62 >     \ * \n\
63 >     \ * THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT!\n\
64 >     \ */\n\n"
65
66 %endif
67
68
69 \subsection{Dealing with Namespace Issues}
70
71
72 In order to avoid name clashes, we qualify type names with the
73 interface name, excepted when it is a built-in type.
74
75 > qualifyName :: String -> TypeRef -> String
76 > qualifyName schemaName (Builtin t) = show t
77 > qualifyName schemaName (TypeVar t) = schemaName ++ "_" ++ t 
78 > qualifyName schemaName (TypeAlias t _) = schemaName ++ "_" ++ t
79
80 When we are declarating real C types, we have to add a @_t@ at the
81 end.
82
83 > qualifyType :: String -> TypeRef -> String
84 > qualifyType qualifier (Builtin String) = "char *"
85 > qualifyType qualifier (TypeAlias name _) = name ++ "_t"
86 > qualifyType qualifier typeDef =
87 >     qualifyName qualifier typeDef ++ "_t"
88
89 When we are generating stubs, we will need to qualify exported procedures:
90 @qualifyProcName@ corresponds to the interface namespace, along with a
91 @_fn@ specifier.
92
93 > qualifyProcName :: String -> TypeRef -> String
94 > qualifyProcName schemaName typeDef = 
95 >     qualifyName schemaName typeDef ++ "_fn"
96
97
98
99 \subsection{Dealing with Declarations}
100
101
102 Often (always), we treat types and messages separately. Hence,
103 @partitionTypesFacts@ takes a list of declarations and partitions
104 it into two lists: one containing the type declarations, the other
105 containing the message declarations.
106
107 > partitionTypesFactsQueries :: [Declaration] -> ([TypeDef], [FactDef], [QueryDef])
108 > partitionTypesFactsQueries declarations = 
109 >     let (types, facts, queries) = foldl' typeFilter ([],[],[]) declarations in
110 >         (types, reverse facts, reverse queries)
111 >         where typeFilter (types, facts, queries) (Factdef f) = (types, f : facts, queries)
112 >               typeFilter (types, facts, queries) (Typedef t) = (t : types, facts, queries)
113 >               typeFilter (types, facts, queries) (Querydef q) = (types, facts, q : queries)
114
115
116 \subsection{Dealing with Messages}