1 ///////////////////////////////////////////////////////////////////////////////
3 // The Datatype compiler
5 ///////////////////////////////////////////////////////////////////////////////
6 #ifndef datatype_compiler_h
7 #define datatype_compiler_h
15 ///////////////////////////////////////////////////////////////////////////////
17 // Forward class declarations
19 ///////////////////////////////////////////////////////////////////////////////
21 class DatatypeHierarchy
;
23 ///////////////////////////////////////////////////////////////////////////////
25 // This class implements the datatype compiler.
27 ///////////////////////////////////////////////////////////////////////////////
28 class DatatypeCompiler
: virtual public CodeGen
{
29 DatatypeCompiler(const DatatypeCompiler
&); // no copy constructor
30 void operator = (const DatatypeCompiler
&); // no assignment
32 ////////////////////////////////////////////////////////////////////////////
33 // Constructor and destructor
34 ////////////////////////////////////////////////////////////////////////////
35 DatatypeCompiler(TyOpt opt
, int embedded_tags
);
36 virtual ~DatatypeCompiler();
38 void preprocess_def (DatatypeDef
);
40 ////////////////////////////////////////////////////////////////////////////
42 // Methods to enter and lookup a pattern constructor.
43 // These interact with the pattern/constructor environment.
44 // Called from the parser.
46 ////////////////////////////////////////////////////////////////////////////
47 static void add_law (LawDef
);
48 static Pat
lookup_pat (Id
);
49 static Exp
lookup_law (Id
, Exps
);
53 friend class DatatypeClass
;
54 friend class DatatypeHierarchy
;
55 TyOpt optimizations
; // optimizations in place
56 static int max_embedded_tags
; // maximum number of tags that
57 // can be embedded into the
58 // lower bits of a pointer.
59 static int max_embedded_bits
;
60 static LabelGen temp_vars
;
61 static HashTable law_env
;
65 ////////////////////////////////////////////////////////////////////////////
66 // Methods for mapping datatypes into C++ classes.
67 ////////////////////////////////////////////////////////////////////////////
68 void gen_datatype(DatatypeDefs
, ViewDefs
, LawDefs
, TyDefs
);
69 void gen_type_def(TyDef
);
70 void gen_law_defs (LawDefs
);
71 void gen_law_inverse (const Loc
*, Id
, Ids
, Exp
, Ty
);
73 ////////////////////////////////////////////////////////////////////////////
74 // Methods for generating datatype instantiation code.
75 ////////////////////////////////////////////////////////////////////////////
76 void instantiate_datatypes (Bool external
, Tys
);
77 void instantiate_datatypes (Bool external
, Ty
);