XTRAN Example — Match & Replace C, C++, Java, or C# Expressions
In the rules below:
this
indicates C, C++, Java, or C# pattern elements<this>
indicates meta pattern elements
Note that XTRAN was told, using a rules language recursive iterator statement, to automatically apply the rules below recursively to every expression in the code being re-engineered.
Process Flowchart
Here is a flowchart for this process, in which the elements are color coded:
- BLUE for XTRAN versions (runnable programs)
- ORANGE for XTRAN rules (text files)
- RED for
code
XTRAN rules:
The following rules effectively convert infix expression notation to prefix notation.
Original expression | Replacement expression |
---|---|
<expr1> + <expr2>
|
add(<expr1>, <expr2>)
|
<expr1> - <expr2>
|
sub(<expr1>, <expr2>)
|
<expr1> * <expr2>
|
mul(<expr1>, <expr2>)
|
<expr1> / <expr2>
|
div(<expr1>, <expr2>)
|
<expr1> = <expr2>
|
copy(&<expr1>, <expr2>)
|
Original code:
a = b + (c - d) * (e - f) / g;
Re-engineered code:
copy(&a, add(b, div(mul(sub(c, d), sub(e, f)), g)));
XTRAN rule:
In the following rule, the match of a "wildcard" pattern element has a qualifying condition; if that condition evaluates to false, the match fails at that element.
Original expression | Replacement expression | Qualifying condition |
---|---|---|
copy(<expr1>, <expr2>)
|
*<expr1> = <expr2>
|
<expr2> is not an
operator expression
|
Original code:
copy(p_var1, *p_var2); copy(p_var3, var4); copy(p_var5, var6 + var7); copy(p_var8 + 3, var9);
Re-engineered code:
copy(p_var1, *p_var2); *p_var3 = var4; copy(p_var5, var6 + var7); *(p_var8 + 3) = var9;