2015-04-20 6 views
0

У меня есть дерево с Expressions(odata4j). Мне нужно, чтобы разобрать его в список выражений, как в Боттоне на фото ниже:Выражение дескриптора синтаксиса в список выражений в Java

http://i58.tinypic.com/x4rsxy.jpg

Каждого OrExpression и AndExpression имеют такие методы, как getRHS(right) и getLeft(left), чтобы получить объекты ниже.

До сих пор у меня есть следующий код:

private BinaryCommonExpression getLeftRek(BinaryCommonExpression expr, ConditionOperator conditionOperator) { 

    BinaryCommonExpression lhs = expr; 
    if (lhs.getLHS() instanceof EntitySimpleProperty == false) { 
     if(lhs instanceof AndExpression){ 
      conditionOperator = ConditionOperator.AND; 
     }else if(lhs instanceof OrExpression){ 
      conditionOperator = ConditionOperator.OR; 
     } 
     getLeftRek((BinaryCommonExpression)lhs.getLHS(), conditionOperator); 
     if(lhs.getRHS() instanceof StringLiteral == false && lhs.getRHS() instanceof DateTimeLiteral == false && lhs.getRHS() instanceof IntegralLiteral == false/*lhs.getRHS() instanceof AndExpression || lhs.getRHS() instanceof OrExpression*/){ 
      getLeftRek((BinaryCommonExpression)lhs.getRHS(), null); 
     } 
    } else { 
     Criterion lhsFinish = getLHSFinish(lhs, conditionOperator); 
     stack.push(lhs+ " "+conditionOperator); 
    } 
    return lhs; 
} 

Вот результат моего списка:

[EqExpression(1) OR, EqExpression(2) AND, LtExpression(3) null, LtExpression(4) OR, EqExpression(5) null] 

Я не могу получить оператору LtExpression(3) и EqExpression(5), потому что его 2 уровней выше в дереве ,

Любые идеи?

ответ

0

Я сделал это по стеклу.

stack.push(lhs); 
    while(stack.get(stack.size()-1) instanceof OrExpression || stack.get(stack.size()-1) instanceof AndExpression){ 

     BinaryCommonExpression popValue = (BinaryCommonExpression)stack.pop(); 

     try{ 
      if(stack.get(stack.size()-2) instanceof OrExpression || stack.get(stack.size()-2) instanceof AndExpression){ 
       String operatorAfter = (String)stack.pop(); 
       BinaryCommonExpression popVal2 = (BinaryCommonExpression)stack.pop(); 
       BinaryCommonExpression lhs2 = (BinaryCommonExpression)popVal2.getLHS(); 
       BinaryCommonExpression rhs = (BinaryCommonExpression)popVal2.getRHS(); 
       stack.push(lhs2); 
       if(popVal2 instanceof OrExpression){ 
        stack.push("OR"); 
       }else if (popVal2 instanceof AndExpression){ 
        stack.push("And"); 
       } 
       stack.push(rhs); 
       stack.push(operatorAfter); 
      } 
      } catch(ArrayIndexOutOfBoundsException e){ 
       e.printStackTrace(); 
      } 
     BinaryCommonExpression lhs2 = (BinaryCommonExpression)popValue.getLHS(); 
     BinaryCommonExpression rhs = (BinaryCommonExpression)popValue.getRHS(); 
     stack.push(lhs2); 
     if(popValue instanceof OrExpression){ 
      stack.push("OR"); 
     }else if (popValue instanceof AndExpression){ 
      stack.push("And"); 
     } 
     stack.push(rhs); 
    } 

Вот ожидаемый результат:

[EqExpression, OR, GtExpression, And, LtExpression, OR, LtExpression, OR, EqExpression]