How to rewrite code in other languages

Consider this simple Java code:

source := 'public class Test {
	public void foo() {
		for (int i = 1; i <= 10; i+=1) {
			bar(i);
		}
	}
}'.
  

Here is how to define a rewrite rule that transforms i+=1 into i++:

rewrite := SmaCCRewriteFile new
		parserClass: JavaParser;
		addTransformation: (SmaCCRewrite
				comment: ''
				match: (SmaCCRewriteTreeMatch new source: '`i` += 1')
				transformation: (SmaCCRewriteStringTransformation new string: '`i` ++')).
  

Once we have the rule, we can apply it, and we get back the rewritten string:

engine := SmaCCRewriteEngine new rewriteRule: rewrite.
node := JavaParser parse: source.
engine
	source: (SmaCCAnnotatedString on: source);
	rewrite: node