weakenの試験を書き終えて、今日は、インクリメントのバグの修正を行っている。
インクリメントは単純そうに見えて意外と構文木を構成するのは難しい。インクリメントには前置と後置の二種類がある。
前置のインクリメントは、1足した後に、その値を返す。
後置のインクリメントは、値を返してから、値を1足す。
さて、これを、どうやって抽象構文木に落とし込もうか。
特に後置のインクリメントは難しそうだね。
ヒントは「代入演算子」と「加算演算子」と「カンマ演算子」で表現できるということだ。
カンマ演算子は(値1, 値2, 値3)と書いて、値3を返す演算子のことね。
答え
答え、というか、今考えていること。
前置インクリメントの抽象構文木
var = var + 1
これは意外と簡単だね。代入演算子が代入した値を返却するから。
後置のインクリメントの抽象構文木
一時変数が必要。
(tmp = var, var = var + 1, tmp)
カンマ演算子が、最後の値を返すことを利用して、上記のように書ける。
代入前の値を、一時変数に保存しておいて、1足して、一時変数を返す。
SPVMは、C言語とPerlの表現に親和させることがひとつの目標なので、少し難しいが頑張って実装する。