TREE_OPERANDの選択

今日は文法まわりを若干。リスト構築子。
全てのオブジェクトはnamespaceであって、namespaceの実体はただのハッシュテーブルのリストでしかないわけだ。
まあ、これは別に構わない。当初の予定通り。
けど、GCC内部のtreeにはハッシュテーブルを持てない物がいくつか存在する。例えば、tree_expは、

struct tree_exp GTY(())
{
  struct tree_common common;
  int complexity;
  tree GTY ((special ("tree_exp"),
             desc ("TREE_CODE ((tree) &%0)")))
    operands[1];
};

こんな構造になってて、余計な空間なんて入ってないわけだ。だから、

var obj = namespace{ };
obj.nanika_flag = true;   
     /* OK。obj内のハッシュテーブルに nanika_flag が暗黙に定義される */

var expr = gcc.build_nt( gcc.PLUS_EXPR, 3, 4);
expr.nanika_flag = true;  
     /* expr はハッシュテーブルを持ってないので、どうしようもない… */

こういうことはできなくなる。まあ、それは仕方無いか。

で、TREE_OPERANDの話。struct tree_expr内のoperandsはTREE_OPERANDマクロで参照できる。

/* GCC 内のCのソースだと思って */
tree expr = build_nt(PLUS_EXPR,bulid_int_2(3,0),build_int_2(4,0));
tree lhs = TREE_OPERAND(expr,0); /* こーやると、定数3が拾える */

まあ、これはいいか。と、すると、ILOG内では、

var expr = gcc.bulid_nt(gcc.PLUS_EXPR,3,4);
var lhs = expr[0];   /* 配列っぽく */

こんな感じにするといいだろうか。ただ、これやると、他のは'[]'演算子はハッシュテーブルへの参照なのに、ここだけ特別扱いになってしまうわけだ。
まあ、ようするに、どうしようか迷ったっていう話。多分これで実装すると思う。だったら最初から書くなって話なんだけど。