hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
module.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_MODULE_HPP_INCLUDED
3 #define HOBBES_LANG_MODULE_HPP_INCLUDED
4 
5 #include <hobbes/lang/type.H>
6 #include <hobbes/lang/expr.H>
7 #include <hobbes/util/ptr.H>
9 #include <memory>
10 #include <iostream>
11 #include <string>
12 #include <vector>
13 
14 namespace hobbes {
15 
16 // modules can define types, variable type bindings, variables, classes, and class instances
17 struct ModuleDef : public LexicallyAnnotated {
18  virtual ~ModuleDef();
19  virtual void show(std::ostream&) const = 0;
20 
21  // improves performance of case-analysis over instances (to avoid 'dynamic_cast')
22 public:
23  int case_id() const;
24 protected:
25  ModuleDef(int cid, const LexicalAnnotation&);
26 private:
27  int cid;
28 };
29 typedef std::shared_ptr<ModuleDef> ModuleDefPtr;
30 typedef std::vector<ModuleDefPtr> ModuleDefs;
31 
32 template <typename Case>
33  struct ModuleDefCase : public ModuleDef {
36  };
37 
38 class MImport : public ModuleDefCase<MImport> {
39 public:
40  MImport(const std::string&, const std::string&, const LexicalAnnotation&);
41 
42  const std::string& path() const;
43  const std::string& name() const;
44 
45  void show(std::ostream&) const;
46 
47  static const int type_case_id = 0;
48 private:
49  std::string p;
50  std::string n;
51 };
52 
53 class MTypeDef : public ModuleDefCase<MTypeDef> {
54 public:
55  enum Visibility { Opaque, Transparent };
56  MTypeDef(Visibility, const std::string& tname, const str::seq& targs, const MonoTypePtr& t, const LexicalAnnotation&);
57 
58  Visibility visibility() const;
59  const std::string& name() const;
60  const str::seq& arguments() const;
61  const MonoTypePtr& type() const;
62 
63  void show(std::ostream&) const;
64 
65  static const int type_case_id = 1;
66 private:
68  std::string tname;
71 };
72 
73 class MVarTypeDef : public ModuleDefCase<MVarTypeDef> {
74 public:
75  MVarTypeDef(const std::string& vname, const QualTypePtr& qty, const LexicalAnnotation&);
76  const std::string& varName() const;
77  const QualTypePtr& varType() const;
78 
79  void show(std::ostream& out) const;
80 
81  static const int type_case_id = 2;
82 private:
83  std::string vname;
85 };
86 typedef std::shared_ptr<MVarTypeDef> MVarTypeDefPtr;
87 typedef std::vector<MVarTypeDefPtr> MVarTypeDefs;
88 
89 class MVarDef : public ModuleDefCase<MVarDef> {
90 public:
91  MVarDef(const str::seq& vargl, const ExprPtr& e, const LexicalAnnotation&);
92  const str::seq& varWithArgs() const;
93  const ExprPtr& varExpr() const;
94 
95  void show(std::ostream& out) const;
96 
97  static const int type_case_id = 3;
98 private:
101 };
102 typedef std::shared_ptr<MVarDef> MVarDefPtr;
103 typedef std::vector<MVarDefPtr> MVarDefs;
104 
105 MVarDefs substitute(const MonoTypeSubst&, const MVarDefs&);
106 
107 typedef std::pair<str::seq, str::seq> CFunDepDef;
108 typedef std::vector<CFunDepDef> CFunDepDefs;
109 
110 class ClassDef : public ModuleDefCase<ClassDef> {
111 public:
112  ClassDef(const Constraints& cs, const std::string& cname, const str::seq& tvars, const CFunDepDefs& fdeps, const MVarTypeDefs& mvtydefs, const LexicalAnnotation&);
113 
114  const Constraints& constraints() const;
115  const std::string& name() const;
116  const str::seq& vars() const;
117  const CFunDepDefs fundeps() const;
118  const MVarTypeDefs& members() const;
119 
120  void show(std::ostream& out) const;
121 
122  static const int type_case_id = 4;
123 private:
125  std::string cname;
127  CFunDepDefs fdeps;
128  MVarTypeDefs mvtydefs;
129 };
130 typedef std::shared_ptr<ClassDef> ClassDefPtr;
131 typedef std::vector<ClassDefPtr> ClassDefs;
132 
133 class InstanceDef : public ModuleDefCase<InstanceDef> {
134 public:
135  InstanceDef(const Constraints& cs, const std::string& cname, const MonoTypes& targs, const MVarDefs& mdefs, const LexicalAnnotation&);
136 
137  const Constraints& constraints() const;
138  const std::string& className() const;
139  const MonoTypes& args() const;
140  const MVarDefs& members() const;
141 
142  void show(std::ostream& out) const;
143 
144  static const int type_case_id = 5;
145 private:
147  std::string cname;
149  MVarDefs mdefs;
150 };
151 typedef std::shared_ptr<InstanceDef> InstanceDefPtr;
152 typedef std::vector<InstanceDefPtr> InstanceDefs;
153 
154 template <typename Case>
156  }
157 
158 // a module is a collection of module definitions
159 class Module {
160 public:
161  Module(const std::string& mname, const ModuleDefs& defs);
162  const std::string& name() const;
163  const ModuleDefs& definitions() const;
164 
165  void show(std::ostream& out) const;
166 private:
167  std::string mname;
168  ModuleDefs defs;
169 };
170 
171 typedef std::shared_ptr<Module> ModulePtr;
172 typedef std::vector<ModulePtr> Modules;
173 
174 // basic utilities
175 std::string show(const Module& m);
176 std::string show(const Module* m);
177 std::string show(const ModulePtr& m);
178 std::string show(const MTypeDef*);
179 std::string show(const ClassDef& cd);
180 std::string show(const ClassDef* cd);
181 std::string show(const InstanceDef& id);
182 std::string show(const InstanceDef* id);
183 std::string show(const ModuleDefPtr& md);
184 std::string show(const CFunDepDef& fundep);
185 std::string show(const CFunDepDefs& fundeps);
186 
187 }
188 
189 #endif
190 
Definition: module.H:53
Definition: module.H:110
std::shared_ptr< ClassDef > ClassDefPtr
Definition: module.H:130
std::vector< InstanceDefPtr > InstanceDefs
Definition: module.H:152
Constraints cs
Definition: module.H:146
QualTypePtr qty
Definition: module.H:84
std::string p
Definition: module.H:49
MVarDefs mdefs
Definition: module.H:149
Definition: module.H:133
ModuleDef(int cid, const LexicalAnnotation &)
Definition: module.C:22
const LexicalAnnotation & la() const
Definition: lannotation.C:98
Definition: module.H:73
std::string vname
Definition: module.H:83
ExprPtr varName(MDFA *dfa, const std::string &vn)
Definition: dfa.C:129
Definition: module.H:33
std::string cname
Definition: module.H:147
Definition: module.H:38
Definition: expr.H:507
std::pair< str::seq, str::seq > CFunDepDef
Definition: module.H:107
virtual ~ModuleDef()
Definition: module.C:24
std::vector< ClassDefPtr > ClassDefs
Definition: module.H:131
std::vector< ModulePtr > Modules
Definition: module.H:172
std::string show(const CFunDepDefs &fundeps)
Definition: module.C:167
Definition: boot.H:7
int case_id() const
Definition: module.C:23
MonoTypePtr t
Definition: module.H:70
Visibility v
Definition: module.H:67
std::string n
Definition: module.H:50
ModuleDefs defs
Definition: module.H:168
MonoType::ptr MonoTypePtr
Definition: type.H:71
std::shared_ptr< MVarTypeDef > MVarTypeDefPtr
Definition: module.H:86
str::seq vargl
Definition: module.H:99
ExprPtr substitute(const VarMapping &vm, const ExprPtr &e, bool *mapped=0)
Definition: expr.C:968
std::vector< CFunDepDef > CFunDepDefs
Definition: module.H:108
str::seq tvars
Definition: module.H:126
str::seq targs
Definition: module.H:69
int cid
Definition: module.H:27
ExprPtr expr
Definition: module.H:100
std::vector< ConstraintPtr > Constraints
Definition: type.H:35
ModuleDefCase(const LexicalAnnotation &)
Definition: module.H:155
Visibility
Definition: module.H:55
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
Definition: lannotation.H:36
std::shared_ptr< InstanceDef > InstanceDefPtr
Definition: module.H:151
std::shared_ptr< Module > ModulePtr
Definition: module.H:171
Definition: lannotation.H:22
std::vector< std::string > seq
Definition: str.H:19
std::vector< MVarTypeDefPtr > MVarTypeDefs
Definition: module.H:87
#define out
Definition: netio.H:19
ModuleDefCase< Case > Base
Definition: module.H:34
std::shared_ptr< MVarDef > MVarDefPtr
Definition: module.H:102
std::vector< MVarDefPtr > MVarDefs
Definition: module.H:103
Definition: module.H:89
virtual void show(std::ostream &) const =0
std::string cname
Definition: module.H:125
Definition: module.H:17
std::vector< MonoTypePtr > MonoTypes
Definition: type.H:72
MVarTypeDefs mvtydefs
Definition: module.H:128
std::shared_ptr< QualType > QualTypePtr
Definition: type.H:28
std::string tname
Definition: module.H:68
Definition: module.H:159
LexicalAnnotation m(const YYLTYPE &p)
Definition: hexpr.parse.C:127
CFunDepDefs fdeps
Definition: module.H:127
Constraints cs
Definition: module.H:124
std::map< TVName, MonoTypePtr > MonoTypeSubst
Definition: type.H:143
std::string mname
Definition: module.H:167
std::shared_ptr< ModuleDef > ModuleDefPtr
Definition: module.H:29
Exprs vars(const std::vector< std::string > &vns, const LexicalAnnotation &la)
Definition: expr.H:706
MonoTypes targs
Definition: module.H:148
std::vector< ModuleDefPtr > ModuleDefs
Definition: module.H:30