initial
[prop.git] / demos / rewrite-trick2.pC
blob5c8ceb4921a9cfa5eadf2d7c055f98913294ba9c
1 #include <iostream.h>
3 datatype Replaced<T> = REPLACED of T
5 and Exp =
6    NUM   of int           => _  
7 |  ADD   of Exp, Exp      => "(" _ "+" _ ")"
8 |  FINAL of Replaced<Exp> => "FINAL(" _ ")"
11 ostream& operator << (ostream& f, Replaced<Exp> e); 
13 instantiate datatype Exp, Replaced<Exp>;
15 ostream& operator << (ostream& f, Replaced<Exp> e)
16    { match (e) of REPLACED e: { return f << "REPLACED(" << e << ")"; } 
17      end match; 
18    }
20 rewrite class Silly (Exp) {
21 public:
22    Silly() {}
25 rewrite Silly {
26    NUM 0:  FINAL(REPLACED(NUM(1)))
27 |  NUM x:  FINAL(REPLACED(NUM(2)))
30 int main() 
32    Exp e = ADD(NUM(0),NUM(3));
33    Silly S;
34    cout << "Before = " << e << '\n';
35    S(e);
36    cout << "After = " << e << '\n';
37    rewrite (e) type (Exp,Replaced<Exp>) {
38       FINAL(REPLACED(e)): e
39    }
40    cout << "Finally = " << e << '\n';
41    return 0;