逆ポーランド記法の変換ツール

中置記法の式を逆ポーランド記法(後置記法)に変換し、演算子をいつスタックに積み、いつ取り出すのかを1字句ずつ表で示します。ポーランド記法(前置記法)と構文木も表示し、変数に値を入れるとスタックを使った計算の様子も確かめられます。逆ポーランド記法の式から、かっこを最小限にした中置記法に戻すこともできます。

式

使える記号: + − × ÷(* / でも可)、^(べき乗)、かっこ。数と英字の変数(A、B、x1 など)を使えます。

変換の結果

逆ポーランド記法(後置記法)
–
ポーランド記法(前置記法)
–
中置記法(かっこは最小限)
–
計算の結果
–

構文木

変換の途中(操車場アルゴリズム)

スタックを使った計算

演算子の優先順位は、^ が最も高く、次に × ÷、最も低いのが + − です。同じ順位の + − × ÷ は左から、^ は右から計算します。÷ は割り切れないときも小数で計算します。

逆ポーランド記法とは

ふだん書く A + B のように、演算子を2つの値の間に置く書き方を中置記法といいます。これに対して、A B + のように演算子を値の後ろに置くのが逆ポーランド記法(後置記法)、+ A B のように前に置くのがポーランド記法(前置記法)です。逆ポーランド記法では、演算子の優先順位やかっこがなくても計算の順番が一通りに決まります。たとえば (A + B) × (C − D) は A B + C D − × となり、かっこが消えます。この性質から、電卓やプログラミング言語の処理系、スタックマシンの命令列などで使われています。

スタックで計算する

逆ポーランド記法の式は、左から順に読みながらスタックを1つ使うだけで計算できます。数や変数ならスタックに積み、演算子なら上から2つの値を取り出して計算し、結果を積みます。取り出した2つのうち、先に取り出した(上にあった)ほうが右側の値になることに注意します。5 1 2 + 4 × + 3 − では、1 + 2 = 3、3 × 4 = 12、5 + 12 = 17、17 − 3 = 14 の順に計算され、最後にスタックに残った14が答えです。例を選び、計算の表でスタックの変化を確かめてみてください。

中置記法から変換する: 操車場アルゴリズム

中置記法の式を逆ポーランド記法に直すには、ダイクストラが考えた操車場アルゴリズムを使います。式を左から読み、数や変数はそのまま出力します。演算子は、スタックの上に優先順位が同じか高い演算子があればそれを出力してから積みます(べき乗のような右結合の演算子では、より高いものだけを出力します)。開きかっこは積み、閉じかっこが来たら開きかっこまでの演算子をすべて出力します。最後にスタックに残った演算子を出力すれば完成です。A + B × C では × のほうが優先順位が高いので + の上に積まれ、A B C × + となります。

構文木との関係

式は、演算子を節、数や変数を葉とする構文木(二分木)で表せます。この木を「左の子、右の子、節」の順にたどる(後行順、帰りがけ順)と逆ポーランド記法、「節、左の子、右の子」の順(先行順、行きがけ順)だとポーランド記法、「左の子、節、右の子」の順(中間順、通りがけ順)だと中置記法になります。コンパイラは、ソースコードの式を構文解析して抽象構文木を作り、それをたどってスタックマシンの命令や機械語を出力します。試験では、式や木から逆ポーランド記法を答える問題や、木のたどり方の名前を問う問題がよく出ます。

コンパイラの問題を解く

逆ポーランド記法(後置記法)で書かれた式「3 4 + 2 * 5 −」を、数が来たらスタックに積み、演算子が来たら2つの値を取り出して計算し、結果を積む方法で評価した。結果はいくらか。ここで、演算子の左側の値は先に積まれた方の値とする。

  1. A−9
  2. B6
  3. C9
答えと解説を見る

正解:C. 9

3、4を積み、+ で取り出して 3 + 4 = 7 を積みます。次に2を積み、* で 7 × 2 = 14 を積みます。5を積み、− で先に積まれた14から後の5を引いて 14 − 5 = 9 が結果です。後置記法は演算の順番が並びで決まるのでかっこが要らず、通常の式では (3 + 4) × 2 − 5 に当たります。−9は引き算の左右を取り違えた値、6はかっこを付けずに 3 + 4 × 2 − 5 と読んだ値です。

式 2 + 3 * 4 の抽象構文木の形として正しいものはどれか。

  1. A根は + の節で、その右の子が 3 * 4 を表す * の節になる
  2. B根は * の節で、その左の子が 2 + 3 を表す + の節になる
  3. C2、3、4、+、* の5つの節が、すべて根の直接の子として並ぶ
答えと解説を見る

正解:A. 根は + の節で、その右の子が 3 * 4 を表す * の節になる

掛け算は足し算より優先順位が高いので、この式は 2 + (3 * 4) と解釈されます。抽象構文木では先に計算する演算ほど下に置かれるので、根は + で、その左の子が2、右の子が3と4を子にもつ * の節になります。木を下から評価すると、3 * 4 = 12 を先に計算し、2 + 12 = 14 が得られます。根が * になるのは (2 + 3) * 4 と書いた場合で、すべてを根の子に並べると計算の順番が表せません。

抽象構文木(AST)の特徴として正しいものはどれか。

  1. Aソースコードの括弧や区切り記号まで、すべてを節として残している
  2. B意味に関係しない記号を省き、演算子の優先順位を木の形で表している
  3. CCPUの命令と1対1に対応しており、そのまま実行できる
答えと解説を見る

正解:B. 意味に関係しない記号を省き、演算子の優先順位を木の形で表している

構文解析では、文法の規則どおりに括弧や区切り記号まで含めた木(具象構文木)ができますが、その後の処理には不要な情報が多く含まれます。抽象構文木は、プログラムの意味に必要な演算や文だけを節にした木で、例えば (a + b) * c では、掛け算の節の下に足し算の節がくることで、括弧がなくても計算の順番が分かります。CPUの命令に対応しているのは、さらに後の段階で生成するコードです。

コンパイラの構文解析で行うこととして正しいものはどれか。

  1. A文字の並びから空白やコメントを取り除き、単語に区切る
  2. Bよく実行される部分を見つけ、実行中に機械語に変換する
  3. Cトークンの並びを文法に照らし、プログラムの構造を木の形に組み立てる
答えと解説を見る

正解:C. トークンの並びを文法に照らし、プログラムの構造を木の形に組み立てる

構文解析は、字句解析で得たトークンの並びが言語の文法に合っているかを調べ、if文の条件と本体、式の中の演算の組み合わせなどの構造を木の形(構文木)に組み立てます。セミコロンの書き忘れや括弧の対応の誤りといった文法のエラーはこの段階で見つかります。空白を取り除いて単語に区切るのは字句解析、実行中に機械語に変換するのはJITコンパイルです。

よくある質問

A − B − C の逆ポーランド記法は何ですか?

A B − C − です。− は左から計算する(左結合の)演算子なので、(A − B) − C と同じ意味になります。A − (B − C) なら A B C − − で、結果が変わります。

逆ポーランド記法にかっこが要らないのはなぜですか?

演算子が来た時点で、直前の2つの値(またはそれまでの計算結果)に必ず適用されるので、どの値どうしを計算するかが書かれた順番だけで決まるからです。中置記法では、同じ並びでも優先順位やかっこによって計算の順番が変わります。

−A のような符号の付いた式は変換できますか?

このツールは2つの値をとる演算子(二項演算子)だけに対応しています。符号のマイナスは (0 − A) のように書いてください。実際の処理系では、単項マイナスを別の演算子として扱います。

試験ではどのように問われますか?

基本情報技術者試験などでは、中置記法の式を逆ポーランド記法で表したものを選ぶ問題、逆ポーランド記法の式の値を求める問題、構文木のたどり方の問題がよく出ます。例を選んで、表の動きを自分の手順と比べてみてください。

関連する用語

構文解析 抽象構文木(AST) スタックポインタ スタック

関連する計算ツール

半導体・電子回路・情報の計算ツール →