package sorts;
import java.util.HashMap;
import parser.ASTsetExpression;
import parser.ASTsortExpression;
import parser.SimpleNode;
import parser.SparcTranslatorTreeConstants;
//TODO add comments
public class BasicSortChecker {
public static boolean isBasic(ASTsortExpression se,
HashMap<String, ASTsortExpression> sortNameToExpression) {
int id = ((SimpleNode) se.jjtGetChild(0)).getId();
switch (id) {
case SparcTranslatorTreeConstants.JJTNUMERICRANGE:
return true;
case SparcTranslatorTreeConstants.JJTIDENTIFIERRANGE:
return true;
case SparcTranslatorTreeConstants.JJTCONCATENATION:
return true;
case SparcTranslatorTreeConstants.JJTSETEXPRESSION:
return checkSetExpression((ASTsetExpression) se.jjtGetChild(0),
sortNameToExpression);
default:
return false;
}
}
private static boolean checkSetExpression(SimpleNode se,
HashMap<String, ASTsortExpression> sortNameToExpression) {
if (se.getId() == SparcTranslatorTreeConstants.JJTSORTNAME) {
return isBasic(sortNameToExpression.get(se.image),
sortNameToExpression);
}
if (se.getId() == SparcTranslatorTreeConstants.JJTCURLYBRACKETS) {
return checkCurlyBrackets((SimpleNode) se);
}
if(se.getId() == SparcTranslatorTreeConstants.JJTFUNCTIONALSYMBOL) {
return false;
}
boolean result = true;
for (int i = 0; i < se.jjtGetNumChildren(); i++) {
result = result
& checkSetExpression((SimpleNode) se.jjtGetChild(i),
sortNameToExpression);
}
return result;
}
private static boolean checkCurlyBrackets(SimpleNode se) {
if (se.getId() == SparcTranslatorTreeConstants.JJTCONSTANTTERM) {
if (se.jjtGetNumChildren() == 1) {
SimpleNode child = (SimpleNode) se.jjtGetChild(0);
if (child.getId() == SparcTranslatorTreeConstants.JJTCONSTANTTERMLIST) {
return false;
}
}
//if(se.jjtGetNumChildren()==0 && se.image.indexOf('_')!=-1)
// return false;
}
boolean result = true;
for (int i = 0; i < se.jjtGetNumChildren(); i++) {
result = result
& checkCurlyBrackets((SimpleNode) se.jjtGetChild(i));
}
return result;
}
}