package sorts;
import java.util.HashMap;
import java.util.HashSet;
import parser.ASTcondition;
import parser.ASTfunctionalSymbol;
import parser.ASTsortExpression;
import parser.ASTsortExpressionList;
import parser.ASTsortName;
import parser.SimpleNode;
import parser.SparcTranslatorTreeConstants;
public class FunctionalSymbolChecker {
public static boolean checkFunctionalSymbolSorts(ASTfunctionalSymbol funcSymbol, HashMap<String, ASTsortExpression> sortNameToExpression ) {
if(funcSymbol.jjtGetNumChildren()<2) // no
return true;
ASTcondition cond =(ASTcondition)funcSymbol.jjtGetChild(1);
HashSet<Integer> basicSortIndexes=fetchAllBasicSortIndexes(cond);
return checkAllBasicSorts((ASTsortExpressionList)funcSymbol.jjtGetChild(0), basicSortIndexes,sortNameToExpression);
}
private static boolean checkAllBasicSorts(ASTsortExpressionList sortList,
HashSet<Integer> basicSortIndexes,HashMap<String, ASTsortExpression> sortNameToExpression) {
for(int i=0;i<sortList.jjtGetNumChildren();i++) {
if(!basicSortIndexes.contains(i))
continue;
ASTsortName sortName=(ASTsortName)sortList.jjtGetChild(i);
ASTsortExpression sortExpr=(ASTsortExpression)sortNameToExpression.get(sortName.image);
if(!BasicSortChecker.isBasic(sortExpr,sortNameToExpression)) {
return false;
}
}
return true;
}
private static HashSet<Integer> fetchAllBasicSortIndexes(SimpleNode n) {
HashSet<Integer> result=new HashSet<Integer>();
if(n.getId()==SparcTranslatorTreeConstants.JJTUNARYCONDITION && n.jjtGetNumChildren()==2)
{
String[] relationArray = n.image.split(" ");
int arg1 = Integer.parseInt(relationArray[0]);
int arg2 = Integer.parseInt(relationArray[2]);
String relationString = relationArray[1];
if(relationString.equals(">=") || relationString.equals("<=") ||
relationString.equals(">") || relationString.equals("<"))
{
result.add(arg1);
result.add(arg2);
}
}
for(int i=0;i<n.jjtGetNumChildren();i++) {
result.addAll(fetchAllBasicSortIndexes((SimpleNode)n.jjtGetChild(i)));
}
return result;
}
}