例えば数式 1\*2+3\*4 を解析するとき、前から順にトークンを取り出し、
1 \* 2 までを(手順に従って)スタック a に積んだ状態(図)。
op1(a[-2] で参照できる、現時点では :\* を指している)と、
今取り出したトークン tk(ここでは :+ )の優先度を比較し、
後者のほうが低いので、:+ に一旦「待て」をしておいて、
待たせてる間にスタック a の中を縮約させる(3つを取り出し1つのノードにまとめて
スタックに戻す)処理を行った上で、「待て」を解除
(実際には再帰呼び出しで優先度比較の場面に戻ってくる)。
次の場面ではop1はスタックの範囲外を指している(値としてはnil、優先度は-1となる)
ので、ここで :+ はスタック a に積まれることになる。
その後のトークンをすべて処理(あとは順々にスタックに積むだけ)
し終わった時点のスタックの状態。
ここで最後の処理(3つ組を縮約する処理をスタック長が1になるまで繰り返す)
を行うのだが、その部分を別途プログラムとしてコーディングするのではなく、
偽演算子 :END (優先度は-1)をトークン列の末尾に予め入れておくことで、
これまで述べたプログラムだけで、最後の処理まで進行することを確認して下さい。
=>Next