変数スペックからのリード関数を全般的に修正

変数スペック(Var)から任意のレジスターへ値を読み出す方法として、以下の4種類の操作を用意した:

struct Var* var_read_address(struct Var* var, const char* register_name)
これは"変数スペックが値の格納に用いているメモリー番地"を、register_nameのレジスターへ得る。
・左辺値の場合はデフォルトのアドレスをレジスターへ得る。
・右辺値の場合はスタックのアドレスをレジスターへ得る。

struct Var* var_pre_read_value(struct Var* var, const char* register_name)
これは左辺値か右辺値かによって結果の値の意味が異なる。
・左辺値の場合は変数が値の格納に用いているメモリー番地を、register_nameのレジスターへ得る。
・右辺値の場合は、スタックから値そのものを得る。
すなわち、左辺値の場合は実際の値ではなく値のアドレスを得る。(これを間接参照した値が、変数に格納されている値となる)
一方、右辺値の場合は変数に結びついた値を得る。(すなわち計算によって変化した値。これは格納位置を直接参照しての値では"無い")

struct Var* var_realize_read_value(struct Var* var, const char* register_name)
これは左辺値か右辺値かに関わらず、変数に結びついた値を得る。
内部動作としては var_pre_read_value() を呼び出して、その結果得られたレジスターの値を:
・左辺値ならば間接参照した値を、register_nameのレジスターへ得る。
・右辺値ならば加工せずに、そのまま。
という処理を行う。
これによって、左辺値か右辺値かを考慮せずに、常に実際に変数に結びついた値を得ることができる。

struct Var* var_indirect_pre_read_value(struct Var* var, const char* register_name)
これはポインター型の場合に、間接参照先のアドレスを得て(値ではなくアドレス)、
さらに変数スペックを左辺値に設定して返す。
この関数の実行結果として得られたregister_nameをスタックへプッシュし、その後 var_realize_read_value() を呼ぶことで
間接参照した実際の値を得ることができる。

以上の操作のみで変数からのリードをすべて賄うつもり。

上記の関数はスカラー型、配列型、どちらの場合でも動作し期待通りの値を返す。(ことを期待している)
配列の場合はインデックスを指定する必要があるが、
その指定方法は、あらかじめregister_nameのレジスターへインデックス値を格納しておくことで行う。

また、上記の関数によって変数リードを行った後の、変数スペックの書き換え(左辺値を右辺値へと設定し直す等)は、
従来は呼出側の責任となっていたが、今回のコミットで、リード後に変数スペックの書き換えを行って返すように修正した。
これによって呼出側の複雑さが軽減されることを期待してる。
(ただし、呼出側が結果のregister_nameをスタックにプッシュする必要があるのは従来のまま。*注意 を参照)

なぜ var_{,indirect}_pre_read_value() 関数が必要かというと、左辺値として動作するためには代入先アドレスを知る必要があるため。
そして変数を用いた計算において、その計算が左辺値であるか右辺値であるかは、計算がある程度進まないと判断できないので、
そのため、変数は計算過程でいつでも左辺値化できるようにしておく必要がある。
また、ポインターの間接参照で(値の格納先アドレスではなく)直接の値を返してしまうと、代入するための情報を失ってしまう。
例:
        int a = 1;
        int *p = &a;
        *p = 123; /* *p が指す a へ 123 を代入するには、
                   * *p を解析した時点で 1 という値ではなく &a というアドレスを得ている必要がある
                   */

そのため、間接参照の場合に、変数スペックを左辺値として、かつ、(値ではなく)格納先アドレスを返す必要があるので、
だから var_{,indirect}_pre_read_value() という pre read 操作を用意してある。

変数が左辺値の場合は、基本的に解析時の変数情報の伝搬はアドレスを伝搬させることで行う。
(すなわち、基本的に var_pre_read_value() によって変数の値を取得し伝搬させる)
そして、左辺値から実際の値を参照するタイミングは、原則としてアキュムレーターの時点まで遅らせる。
一度アキュムレーターを介して結果を得ると、以降に伝搬される変数情報は右辺値となるが、
ポインターによる間接参照の操作を要求する場合には、その変数情報を再び左辺値として伝搬させる必要がある。
(だから var_indirect_pre_read_value() として、わざわざアドレス止まりの情報だけを得る命令が必要となる)

ポインターによる間接参照と、左辺値から実際の値への間接参照とでは、実際のアセンブラレベルでの命令自体は似てるが、
その発動条件や概念としてはあまり似ていないので、別にしてある。

*注意:
上記の関数は、どれも共通して、結果のregister_nameをスタックにプッシュする必要がある。
それは呼出側の責任で忘れずに行う必要がある。

このコミットによって壊れるどころか、ビルド自体が不能となる。(対応部分を書き直す必要があるが、それらをまだ行っていない為)