package translating; import java.util.HashMap; import java.util.HashSet; import parser.ASTaggregateElement; import parser.ASTchoice_element; import parser.SimpleNode; import parser.SparcTranslatorTreeConstants; /** * Class for renaming variables in program structures (aggregates,choice rules) * */ public class LocalVariableRenamer { HashSet<String> bodyVariables; public LocalVariableRenamer() { } public void setBodyVariables(HashSet<String> bodyVariables) { this.bodyVariables = bodyVariables; } public void renameLocalVariables(ASTaggregateElement agrelem,int idx,HashMap<String,String> originalNamesMapping) { HashSet<String> localVariables = new HashSet<String>(); for (int i = 0; i < agrelem.jjtGetNumChildren(); i++) { if (((SimpleNode) (agrelem.jjtGetChild(i))).getId() == SparcTranslatorTreeConstants.JJTTERM) { localVariables.addAll(fetchVariableNames((SimpleNode) (agrelem .jjtGetChild(i)))); } } // remove variable which do not occur in the body of the aggregate but occur in the body of the corresponding rule for(String var: bodyVariables) { // check if the variable does not occur in the body of the aggregate boolean varToRemove = true; for(int i=0;i<agrelem.jjtGetNumChildren();i++) { if (((SimpleNode) (agrelem.jjtGetChild(i))).getId() == SparcTranslatorTreeConstants.JJTEXTENDEDSIMPLEATOMLIST) { if(fetchVariableNames((SimpleNode) (agrelem .jjtGetChild(i))).contains(var)) { varToRemove = false; } } } if(varToRemove) { localVariables.remove(var); } } renameLocalVariables(agrelem, "_L" + idx, localVariables,originalNamesMapping); } /** * Rename all local variables in given AST subtree(n) by adding a suffix * * @param n * AST subtree * @param addSuffix * string to be appended to each local variable * @param localVariables * set of local variables in given AST subtree to be renamed */ private void renameLocalVariables(SimpleNode n, String addSuffix, HashSet<String> localVariables,HashMap<String,String> originalNamesMapping) { if (n.getId() == SparcTranslatorTreeConstants.JJTVAR && localVariables.contains(n.image)) { originalNamesMapping.put(n.image+addSuffix,originalNamesMapping.get(n.image)); n.image = n.image + addSuffix; } for (int i = 0; i < n.jjtGetNumChildren(); i++) { renameLocalVariables((SimpleNode) (n.jjtGetChild(i)), addSuffix, localVariables,originalNamesMapping); } if (n.getId() == SparcTranslatorTreeConstants.JJTTERM) { originalNamesMapping.put(n.toString(false), n.toString(true)); } } /** * Fetch variables from given node * * @param n * node to explore * @return variable->sort_expression mapping, where sort expression * describes a language of string each of which may be used as a * substitution for given variable */ private HashSet<String> fetchVariableNames(SimpleNode n) { HashSet<String> result = new HashSet<String>(); if (n.getId() == SparcTranslatorTreeConstants.JJTVAR) { result.add(n.image); } for (int i = 0; i < n.jjtGetNumChildren(); i++) { result.addAll((fetchVariableNames((SimpleNode) (n.jjtGetChild(i))))); } return result; } }