0

私は、シャント ヤード アルゴリズムを実装しようとしています。コードはユーザーからの入力を取得し、別の関数によって評価された後 (これは既に行われています)、後置表記に変換されてから計算に渡されます。以下のコードは、アルゴリズム自体のためのものです。つまり、ユーザーの入力から作成されたトークンのベクトルです。コードは私には理にかなっていますが、コンパイルされませんが、どこが正しくないのかわかりません。

  double eval_infix_expr(vector<Token> ie, map<string,double> sym_tab)
{
    vector<Token> postfix_expr;



static bool IsOperator(const string& token) {
  return token == "+" ||
         token == "-" ||
         token == "*" ||
         token == "/" ||
         token == "%";
}

static int PrecedenceOf(const string& token) {
  if (token == "+" || token == "-") return 0;
  if (token == "*" || token == "/" || token == "%") return 1;
  throw runtime_error("Unknown operator: " + token);
}




bool expectingOperator = false;


  for (size_t i = 0; i < ie.size(); ++i) {

    if (IsOperator(ie[i])) {

      if (!expectingOperator)
        throw runtime_error("Unexpected operator: " + ie[i]);



      while (!sym_tab.empty() && IsOperator(sym_tab.top()) &&
             PrecedenceOf(sym_tab.top()) >= PrecedenceOf(ie[i])) {
        postfix_expr.push_back(sym_tab.top()); sym_tab.pop();
      }


      sym_tab.push(ie[i]);

    expectingOperator = false;
    }


    else if (ie[i] == "(") {

      if (expectingOperator)
        throw runtime_error("Expected operator, found (.");
      sym_tab.push(ie[i]);
    }

    else if (ie[i] == ")") {


      if (!expectingOperator)
        throw runtime_error("Expected value, found ).");



      while (!sym_tab.empty() && sym_tab.top() != "(") {
        postfix_expr.push_back(sym_tab.top()); sym_tab.pop();
      }


      if (sym_tab.empty())
        throw runtime_error("Imbalanced parentheses.");


      sym_tab.pop();


      expectingOperator = true;
    }

    else {

      if (expectingOperator)
        throw runtime_error("Expecting operator, found " + ie[i]);


      postfix_expr.push_back(ie[i]);

 expectingOperator = true;
    }
  }


  if (!expectingOperator)
    throw runtime_error("Expected value, didn't find one.");


  while (!sym_tab.empty()) {
    if (sym_tab.top() == "(")
      throw runtime_error("Imbalanced parentheses.");
    postfix_expr.push_back(sym_tab.top()); sym_tab.pop();
  }
}


    postfix_Evaluator pe(postfix_expr);
    return pe.eval();

}

}
4

0 に答える 0