예제 #1
0
tree
evaluate (tree t) {
  if (is_atomic (t)) return t;
  cout << "Evaluate "
    // << obtain_ip (t) << " "
       << "[" << (t.operator -> ())
       << ", " << (std_env.operator -> ()) << "] "
       << t << INDENT << LF;
  memorizer mem= evaluate_memorizer (std_env, t);
  if (is_memorized (mem)) {
    cout << UNINDENT << "Memorized " << mem->get_tree () << LF;
    std_env= mem->get_environment ();
    return mem->get_tree ();
  }
  memorize_start ();
  tree r= evaluate_impl (t);
  decorate_ip (t, r);
  mem->set_tree (r);
  mem->set_environment (std_env);
  memorize_end ();
  cout << UNINDENT << "Computed " << mem->get_tree ()
    // << " at " << obtain_ip (r);
       << LF;
  return mem->get_tree ();
}
예제 #2
0
void
decorate_ip (tree ref, path ip) {
  if (obtain_ip (ref) == path (DETACHED)) {
    ref->obs= list_observer (ip_observer (ip), ref->obs);
    if (is_compound (ref)) {
      int i, n= N(ref);
      for (i=0; i<n; i++)
	decorate_ip (ref[i], ip);
    }
  }
}
예제 #3
0
tree
rewrite (tree t) {
    cout << "Rewrite "
         //<< "[" << (t.operator -> ())
         //<< ", " << (std_env.operator -> ()) << "] "
         << t << INDENT << LF;
    memorizer mem= rewrite_memorizer (std_env, t);
    if (is_memorized (mem)) {
        cout << UNINDENT << "Memorized " << mem->get_tree () << LF;
        std_env= mem->get_environment ();
        return mem->get_tree ();
    }
    memorize_start ();
    tree r= rewrite_impl (t);
    decorate_ip (t, r);
    mem->set_tree (r);
    mem->set_environment (std_env);
    memorize_end ();
    cout << UNINDENT << "Rewritten as " << mem->get_tree () << LF;
    return mem->get_tree ();
}
예제 #4
0
void
decorate_ip (tree src, tree dest) {
  decorate_ip (dest, decorate_right (obtain_ip (src)));
}