package net.sf.orcc.backends.c.dal;
import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import net.sf.orcc.OrccRuntimeException;
import net.sf.orcc.ir.ArgByRef;
import net.sf.orcc.ir.ArgByVal;
import net.sf.orcc.ir.ExprBinary;
import net.sf.orcc.ir.ExprInt;
import net.sf.orcc.ir.ExprUnary;
import net.sf.orcc.ir.ExprVar;
import net.sf.orcc.ir.Expression;
import net.sf.orcc.ir.util.AbstractIrVisitor;
/**
* Stringify lists of expressions
*
* @author James Guthrie
*
*/
public class Stringifier extends AbstractIrVisitor<String> {
public Stringifier() {
super(true);
}
@Override
public String caseExpression(Expression expr) {
throw new OrccRuntimeException("unhandled expr: " + expr);
}
@Override
public String caseArgByRef(ArgByRef argByRef) {
return argByRef.getUse().getVariable().getName();
}
@Override
public String caseArgByVal(ArgByVal argByVal) {
return doSwitch(argByVal.getValue());
}
@Override
public String caseExprVar(ExprVar exprVar) {
return exprVar.getUse().getVariable().getName();
}
@Override
public String caseExprInt(ExprInt exprInt) {
return "" + exprInt.getIntValue();
}
@Override
public String caseExprUnary(ExprUnary exprUnary) {
return exprUnary.getOp().toString().toLowerCase() + "_" + doSwitch(exprUnary.getExpr());
}
@Override
public String caseExprBinary(ExprBinary exprBinary) {
String join = "";
String left = doSwitch(exprBinary.getE1());
String right = doSwitch(exprBinary.getE2());
join = exprBinary.getOp().toString().toLowerCase();
return left + "_" + join + "_" + right;
}
public <E extends EObject> String doSwitch(EList<E> arguments) {
String retStr = "";
Iterator<E> iter = arguments.iterator();
while (iter.hasNext()) {
E a = iter.next();
retStr += this.doSwitch(a);
if (iter.hasNext()) {
retStr += "_";
}
}
return retStr;
}
}