ポインター型のサポートを追加し、アタッチを廃止。

アタッチは廃止した。
代わりにc言語風なポインターのサポートを追加した。
ポインターの構文定義は以下のようになっている:

    pointer
        : 空
        | *
        | * pointer

    initializer
        : type_specifier pointer IDENTIFIER initializer_param
        | initializer , pointer IDENTIFIER initializer_param
        | initializer = expression

    var_identifier
        : pointer IDENTIFIER
        | var_identifier [ expression ]

変数のインスタンス生成 (initializer) 時にポインターとして定義することで、
その変数インスタンスはポインター型の何かとなる:

    float x;
    float * p; /* p はポインター型 */
    p = &x; /* p に x のアドレスをセット */

    __print( p ); /* この場合はアドレス自体か読まれる */
    __print( * p ); /* この場合は p の値を間接参照し、x の値が読まれる */

ポインター型として宣言するということは、本質的には、
変数スペック設定として、間接参照の次元を一つ余計に挟むように設定するということ。
すなわち、非ポインター型は、間接参照の次元が 0 な変数である。
そして、1次元のポインター型は、間接参照の次元が 1 な変数である。
内部的にはこのような考え方でポインターを解釈している。
すなわち、"変数参照時"に付加するポインター演算子の場合は、
本質的には、間接参照演算子として機能する。
一方、"変数宣言時"に付加するポインター演算子の場合は、
本質的には、この変数に許される間接参照の次元を設定するという意味である。

この変数参照時に付加するポインター演算子を、間接参照演算子と呼ぶとして、
この間接参照演算子は複数指定することもできる。
ただし、それはこの変数が"変数宣言時"の定義として設定した間接参照次元の分まで許される:

    float * * * p; /* 三次の間接参照までが許される変数 */
    p = 1;         /* p 自体に 1 を代入するという意味 */
    * p = 2;       /* p を間接参照し、アドレス 1 の位置に 2 を代入するという意味 */
    * * p = 3;     /* p を間接参照し、アドレス "1 -> 2 -> ここ" へ 3 を代入 */
    * * * p = 4;   /* p を間接参照し、アドレス "1 -> 2 -> 3 -> ここ"へ 4 を代入 */
    * * * * p = 5; /* これは p に許された間接参照次元を越えているのでエラーとなる */

普通の変数(非ポインター変数)では、この許される間接参照の次元が 0 とされている。
ポインター型と、非ポインター型には本質的な違いは無く、ただ単に、この次元の差にすぎない。
普通の変数に対して、間接参照演算子を摘要するとエラーになるメカニズムと、
上記の例で * * * * p = 5; がエラーとなるメカニズムは、まったく同一である。
(いずれも、自身に許された間接参照次元を越えたことがトリガーとなりエラーとなる)

内部的な実装としては、
struct Var (これは普遍的な変数スペック)と、
struct VarHandle (これは動的な変数スペック)の両方に、
indirect_len (間接参照長さ)というメンバー変数を加え、
これを用いてポインター動作を行っている。

宣言時のポインター演算子の個数が、 Var の indirect_len へセットされる。
一方、参照時のポインター演算子の個数は VarHandle の indirect_len へと
セットされる。
そして、参照時には VarHandle の indirect_len 回だけ、PALMEM(), PASMEM() などで
間接参照を繰り替えして目的アドレスへとたどり着く。
その際のエラーチェックとして、Var の indirect_len を用いる。(この回数を越えればエラー)

OsecpuBasic時代の構文の名残りとして、
最初がアスタリスクの識別子(例: *LABEL など)は、ラベルとして構文解析されてしまう。
コミットコメント中の例において、 ****p = 5; などと書かずに、
わざわざスペースを開けて * * * * p = 5; と書いているのは、
このラベル構文とのバッティング対策。(このような書き方をしなければ、ラベルとして認識されてしまう)
この盲腸のような *LABEL 構文は早急に直したい。(今まで後回しになっていた)
近いうちにラベル定義も *LABEL ではなく、 LABEL: の形へと改めたい。