*/
protected LinkedList<MathExpression> buildAvailiableChildren() throws ReportException {
LinkedList<MathExpression> list = new LinkedList<MathExpression>();
for(int i=0; i< children.size(); i++) {
MathExpression child = children.get(i);
if(!(child instanceof MathExpressionConditionBinary)
&& !(child instanceof MathExpressionConditionUnaryNull)) {
list.add(child);
} else {
MathExpression core = (MathExpression) child;
//условие валидное, берем
if(!core.containsMissingVariables()) {
list.add(child);
//условие невалидное, а список еще пуст
} else if(list.size() ==0) {
if(i+1 >= children.size()) {
//если список условий заканчивается, выходим
break;
}
//проверим и пропустим невалидный оператор условия
MathExpression operator = children.get(i+1);
if(!(operator instanceof MathExpressionOperatorRef)) {
throw new ReportException("В условии пропущен оператор.");
}
i++;
//условие невалидное в списке уже есть оператор
} else if(i+1<children.size()) {
//есть 2 опрератора, нужно выбрать один
MathExpression operator1 = list.getLast();
MathExpression operator2 = children.get(i+1);
list.removeLast();
//проверим что операторы
if(!(operator1 instanceof MathExpressionOperatorRef)
|| !(operator2 instanceof MathExpressionOperatorRef)) {
throw new ReportException("В условии пропущен оператор.");
}
int priority1 = ((MathExpressionOperatorRef)operator1).getRef().getPriority();
int priority2 = ((MathExpressionOperatorRef)operator2).getRef().getPriority();
//вернем в список валидный (менее приоритетный)
list.add(priority1 >= priority2 ? operator2 : operator1);
i++;
//условие невалидное, а список не пуст, проверим и удалим последний оператор в списке
} else {
MathExpression operator = list.getLast();
if(!(operator instanceof MathExpressionOperatorRef)) {
throw new ReportException("В условии пропущен оператор.");
}
list.removeLast();
}