private ExpressionNode parseExpression() throws ParseExpressionException {
    ExpressionNode rootNode = null;

    rootNode = parseTerm();
    scanner.nextSymbol();
    while (isLogicalOp()) {
      if (scanner.isAnd()) {
        ExpressionNode oldRootNode = rootNode;
        rootNode = new ExpressionAndNode(oldRootNode, parseTerm());
      } else if (scanner.isOr()) {
        ExpressionNode oldRootNode = rootNode;
        rootNode = new ExpressionOrNode(oldRootNode, parseTerm());
      } else {
        throw new ParseExpressionException();
      }
    }

    return rootNode;
  }
 private boolean isLogicalOp() {
   return (scanner.isAnd() || scanner.isOr());
 }