1 ///////////////////////////////////////////////////////////////////////////////
3 // This file implements the basic routines on definitions and statements
6 ///////////////////////////////////////////////////////////////////////////////
8 #include <istd::ostream.h>
11 #include "setl-ast.ph"
13 ///////////////////////////////////////////////////////////////////////////////
15 // Instantiate the AST datatypes.
17 ///////////////////////////////////////////////////////////////////////////////
18 instantiate datatype Def, Sig, Stmt,
19 List<Def>, List<Sig>, List<LabSig>,
22 ///////////////////////////////////////////////////////////////////////////////
24 // The rest of pretty printing functions for definitions and statements
26 ///////////////////////////////////////////////////////////////////////////////
28 ///////////////////////////////////////////////////////////////////////////////
30 // Pretty print a signature
32 ///////////////////////////////////////////////////////////////////////////////
33 std::ostream& operator << (std::ostream& f, Sig s)
35 { NOsig: { f << "none"; }
36 | IDsig id: { f << id; }
37 | DOTsig (s,id): { f << s << '.' << id; }
38 | APPsig (s,ss): { f << s << '(' << ss << ')'; }
39 | DEFsig def: { f << "<def>"; }
40 | LAMBDAsig (_,_): { f << "<lambda>"; }
45 ///////////////////////////////////////////////////////////////////////////////
47 // Pretty print a signature list
49 ///////////////////////////////////////////////////////////////////////////////
50 std::ostream& operator << (std::ostream& f, Sigs ss)
52 { #[one]: { f << one; ss = #[]; }
53 | #[one ... rest]: { f << one << ", "; ss = rest; }
58 ///////////////////////////////////////////////////////////////////////////////
60 // Pretty print a statement
62 ///////////////////////////////////////////////////////////////////////////////
63 std::ostream& operator << (std::ostream& f, Stmt s)
66 { NOstmt: { f << "skip;"; }
67 | ASSIGNstmt (a, b): { f << a << " := " << b << ';'; }
68 | BLOCKstmt (_, stmts): { f << stmts; }
70 { f << "while " << e << " loop " << s << " end loop"; }
72 { f << "if " << e << " then " << y << " else " << n << "end if"; }
74 { f << "forall " << bs << " loop " << s << "end loop"; }
76 { f << "return " << e << ';'; }
80 { f << "rewrite ..."; }
82 { f << "rewrite ..."; }
87 ///////////////////////////////////////////////////////////////////////////////
89 // Pretty print a list of statements
91 ///////////////////////////////////////////////////////////////////////////////
92 std::ostream& operator << (std::ostream& f, Stmts s)
94 { #[one]: { f << one; s = #[]; }
95 | #[h ... t]: { f << h << " "; s = t; }
100 ///////////////////////////////////////////////////////////////////////////////
102 // Pretty print a generator expression
104 ///////////////////////////////////////////////////////////////////////////////
105 std::ostream& operator << (std::ostream& f, Generator b)
107 { GENERATOR{ pat,guard,exp }:
109 if (guard != NOexp) f << " | " << guard;
116 ///////////////////////////////////////////////////////////////////////////////
118 // Pretty print a list of generator expressions
120 ///////////////////////////////////////////////////////////////////////////////
121 std::ostream& operator << (std::ostream& f, Generators b)
123 { #[one]: { f << one; b = #[]; }
124 | #[h ... t]: { f << h << ", "; b = t; }