ウィキペディアで説明されているように、シャンティングヤードアルゴリズムを使用しています。
演算子を処理するときのアルゴリズムの説明は次のとおりです。
トークンが演算子o1の場合:
演算子スタックの一番上に演算子トークンo2があり、
o1 is left-associative and its precedence is less than or equal to that of o2, or o1 is right associative, and has precedence less than that of o2,
次に、オペレータースタックから出力キューにo2をポップします。
o1をオペレータースタックにプッシュします。
ただし、次の例を示します。
入力:
sin max 2 3 / 3 * 3.1415
アルゴリズムが/
トークンをヒットした場合、何が起こるかについての説明は次のとおりです。
Token | Action | Output (in RPN) | Operator Stack
...
/ | Pop token to output | 2 3 max | / sin
...
彼らは関数トークンをmax
から取り出してstack
に入れていqueue
ます。彼らのアルゴリズムによると、これは関数トークンが両方とも演算子であり、演算子よりも優先順位が低いことを意味するように思われます/
。
これが事実であるかどうかについての説明はありません。では、Shunting-yard
アルゴリズムの場合、関数の優先順位は何ですか?機能は右または左に関連付けられていますか?それともウィキペディアは単に不完全/不正確ですか?
sin( max( 2 3) / 3 * 3.1415)