Here is a sample changer that changes all instances of the pre-increment operator (e.g. ++a) to the equivalent assignment:
#include "c_breeze.h" class preincChanger: public Changer { // What to do at a unary node Node * at_unary (unaryNode *u, Order) { // Is this node doing a preinc? if (u->op()->id() == Operator::PREINC) { // Make a node for 'expr + 1' binaryNode * add = new binaryNode ('+', (exprNode *) ref_clone_changer::clone(u->expr(), false), new constNode(1)); // Make a node for 'expr = expr + 1' binaryNode *assg = new binaryNode ('=', u->expr(), add); // Return the node return assg; } // If the node wasn't a preinc, just return it return u; } public: preincChanger (void) : Changer(Postorder, // visit the tree in postorder (preorder // would have worked in this case as well) Subtree, // descend subtrees false) { } // don't delete the old node; in this case, // the old node remains in the tree, it's // just placed a little deeper. }; class preincPhase: public Phase { public: preincChanger ic; void run() { unit_list_p u; for (u=CBZ::Program.begin(); u!= CBZ::Program.end(); u++) { (*u)->change(ic); } } }; // This line allows you to use the option "-preinc" to invoke // our phase Phases Phase("preinc", new preincPhase());