package cupcarbon_script;
public class CupEvalCondition {
protected CupScript script;
public CupEvalCondition(CupScript script) {
this.script = script;
}
public CupConditionElement initCondition(String condition) {
condition = condition.replaceAll(" ", "");
int frst = condition.indexOf("(");
int last = condition.lastIndexOf(")");
if (frst == 0 && last == condition.length() - 1)
if (condition.indexOf("(", frst + 1) < condition.indexOf(")", frst + 1))
condition = condition.substring(frst + 1, last);
if (getNbConditions(condition) == 0) {
CupConditionElementEnd cond = new CupConditionElementEnd(script, condition);
return cond;
}
String[] tCondition = getTwoParts(condition);
if (tCondition == null)
return null;
if (tCondition[2] == "&&") {
CupConditionElementAnd cond = new CupConditionElementAnd(initCondition(tCondition[0]), initCondition(tCondition[1]));
return cond;
}
if (tCondition[2] == "||") {
CupConditionElementOr cond = new CupConditionElementOr(initCondition(tCondition[0]), initCondition(tCondition[1]));
return cond;
}
return null;
}
public String[] getTwoParts(String condition) {
int idxAnd;
String res[] = new String[3];
String block1;
String block2;
int fromIndex = 0;
idxAnd = condition.indexOf("&&", fromIndex);
while (idxAnd != -1) {
block1 = condition.substring(0, idxAnd);
block2 = condition.substring(idxAnd + 2, condition.length());
res[0] = block1;
res[1] = block2;
res[2] = "&&";
if (correctNbBrackets(block1) && correctNbBrackets(block2))
return res;
fromIndex = idxAnd + 2;
idxAnd = condition.indexOf("&&", fromIndex);
}
idxAnd = condition.indexOf("||");
while (idxAnd != -1) {
block1 = condition.substring(0, idxAnd);
block2 = condition.substring(idxAnd + 2, condition.length());
res[0] = block1;
res[1] = block2;
res[2] = "||";
if (correctNbBrackets(block1) && correctNbBrackets(block2))
return res;
fromIndex = idxAnd + 2;
idxAnd = condition.indexOf("||", fromIndex);
}
return null;
}
public int getNbConditions(String condition) {
int compBrOPen = 0;
int compBrClose = 0;
for (int i = 0; i < condition.length(); i++) {
if (condition.charAt(i) == '(')
compBrOPen++;
else if (condition.charAt(i) == ')') {
compBrClose++;
}
}
if (compBrOPen == compBrClose)
return compBrOPen;
return -1;
}
public boolean correctNbBrackets(String condition) {
int compBrOPen = 0;
int compBrClose = 0;
for (int i = 0; i < condition.length(); i++) {
if (condition.charAt(i) == '(')
compBrOPen++;
else if (condition.charAt(i) == ')') {
compBrClose++;
}
}
if (compBrOPen == compBrClose)
return true;
return false;
}
}