Exemplo n.º 1
0
  // ========================================================
  // addVariable
  // 変数追加メソッド
  //
  // @arg
  // MathOperand* pOperand : 追加するオペランド
  //
  // ========================================================
  public void addVariable(MathOperand pOperand) throws MathException {
    /* 重複チェック */
    boolean bDuplicate = false;

    for (MathOperand it : m_vecVariables) {

      if (it.matches(pOperand)) {
        bDuplicate = true;
        break;
      }
    }

    /* 重複しない場合 */
    if (!bDuplicate) {

      /* 変数リストに追加 */
      m_vecVariables.add(pOperand);
    }

    /* オペランドを追加 */
    this.addOperand(pOperand);
  }
Exemplo n.º 2
0
  // ========================================================
  // addOperand
  // オペランド追加メソッド
  //
  // @arg
  // MathOperand* pOperand : 追加するオペランド
  //
  // @throw
  // MathException
  //
  // ========================================================
  public void addOperand(MathOperand pOperand) throws MathException {
    /* 1変数のみの式を構成する場合 */
    if (m_pRootFactor == null) {
      m_pRootFactor = pOperand;
    }

    /* 例外処理 */
    if (m_stackCurOperator.empty()) {
      throw new MathException(
          "MathExpression", "addOperand", "no operator written before this operand");
    }

    /* 関数構築中の場合 */
    if (m_pCurFuncOperator != null && m_stackCurOperator.peek() == m_pFuncParentOperand) {
      /* 関数引数として要素追加 */
      m_pCurFuncOperator.addFactor(pOperand);
    }

    /* 関数演算子fnの場合 */
    else if (m_stackCurOperator.peek().matches(eMathOperator.MOP_FN)) {

      /* 変数オペランドMath_ci以外を受理しない */
      if (pOperand.matches(eMathOperand.MOPD_CI)) {
        ((Math_fn) m_stackCurOperator.peek()).setFuncOperand((Math_ci) pOperand);
      } else {
        throw new MathException(
            "MathExpression", "addOperand", "can't use constant number for function operand");
      }
    }

    /* その他の演算子 */
    else {
      /* 演算子にオペランド追加 */
      m_stackCurOperator.peek().addFactor(pOperand);
    }
  }