1 ///////////////////////////////////////////////////////////////////////////////
3 // This file implements the auxiliary methods of the constraint compiler,
4 // which include various pretty printing and AST transformation routines.
6 ///////////////////////////////////////////////////////////////////////////////
8 #include <AD/strings/quark.h>
11 #include "constraint.ph"
17 ///////////////////////////////////////////////////////////////////////////////
19 // Instantiate the constraint datatypes
21 ///////////////////////////////////////////////////////////////////////////////
22 instantiate datatype ConstraintSet,
29 ///////////////////////////////////////////////////////////////////////////////
31 // Pretty printing routines.
33 ///////////////////////////////////////////////////////////////////////////////
35 ///////////////////////////////////////////////////////////////////////////////
37 // Pretty print a rule set.
39 ///////////////////////////////////////////////////////////////////////////////
40 ostream& operator << (ostream& f, ConstraintSet ruleset)
42 CONSTRAINTset rules: { return f << rules; }
46 ///////////////////////////////////////////////////////////////////////////////
48 // Pretty print a list of constraint definition.
50 ///////////////////////////////////////////////////////////////////////////////
51 ostream& operator << (ostream& f, ConstraintDefs defs)
52 { match while (defs) of
53 #[ one ... rest ]: { f << one; defs = rest; }
58 ///////////////////////////////////////////////////////////////////////////////
60 // Pretty print a definition.
62 ///////////////////////////////////////////////////////////////////////////////
63 ostream& operator << (ostream& f, ConstraintDef def)
65 CONSTRAINTruledef r: { return f << r << '\n'; }
66 | CONSTRAINTtype (id,ty): { return f << id << " : " << ty << ";\n"; }
67 | CONSTRAINTinstness (id,pat): { return f << id << " = " << pat << ";\n"; }
68 | CONSTRAINTdet (id,pat,det): { return f << id << " :: " << pat
69 << " is " << det << ";\n";
74 ///////////////////////////////////////////////////////////////////////////////
76 // Pretty print a constraint rule.
78 ///////////////////////////////////////////////////////////////////////////////
79 ostream& operator << (ostream& f, ConstraintRule rule)
81 CONSTRAINTrule { id, pat, body = CONSTRAINTnone ... }: // axiom
82 { return f << id << ' ' << pat << ';'; }
83 | CONSTRAINTrule { id, pat, body ... }: // inference rule
84 { return f << id << ' ' << pat << " :- " << body << ';'; }
88 ///////////////////////////////////////////////////////////////////////////////
90 // Pretty print the body of a constraint.
92 ///////////////////////////////////////////////////////////////////////////////
93 ostream& operator << (ostream& f, ConstraintBody b)
95 CONSTRAINTnone: // skip
96 | CONSTRAINTcut: { f << "!"; }
97 | CONSTRAINTand (a,b): { f << a << ", " << b; }
98 | CONSTRAINTif (a,b,c): { f << "if " << a << " then " << b
99 << " else " << c << " end if"; }
100 | CONSTRAINTbody _: { f << "{ ... }"; }
101 | CONSTRAINTcall e: { f << e; }
106 ///////////////////////////////////////////////////////////////////////////////
108 // Hash function for id/type pair
110 ///////////////////////////////////////////////////////////////////////////////
111 unsigned int id_ty_hash (HashTable::Key k)
112 { Pair<Id,Ty> key = (Pair<Id,Ty>)(k);
113 return string_hash(key->fst); // + ty_hash(key->snd);
116 ///////////////////////////////////////////////////////////////////////////////
118 // Equality function for id/type pair
120 ///////////////////////////////////////////////////////////////////////////////
121 Bool id_ty_equal (HashTable::Key a, HashTable::Key b)
122 { Pair<Id,Ty> x = (Pair<Id,Ty>)(a);
123 Pair<Id,Ty> y = (Pair<Id,Ty>)(b);
124 return string_equal(x->fst,y->fst); // && ty_equal(x->snd,y->snd);
128 ///////////////////////////////////////////////////////////////////////////////
130 // Constructor and destructor of the constraint compiler
132 ///////////////////////////////////////////////////////////////////////////////
133 ConstraintCompiler:: ConstraintCompiler() : internal(0) {}
134 ConstraintCompiler::~ConstraintCompiler() {}