AST

パーサの仕事は八割がた構文木を作ることであろうと思うわけなので、caperにも構文木を作る機能をつけようかな、なんて思ったり思わなかったりするわけですが、

C++の場合は構文木を作るといっても一意でない(いろいろなやり方が考えられる)し、せっかくtemplateなソースを出力するわけなので、SemanticActionのほうでどうにでもなるような気もしないでもないですね。

さて、具体的にはどうすればいいのだろう?

ひとつの案としては、struct Foo; struct Bar : Foo; struct Baz : Foo とかノード種別分書くのがめんどう、というのが一番の問題であるのだから、MLの多相型定義みたいのを与えるとそれに相当する継承構造を持ったstruct群を生成してくれるようなプログラムを書けばよいのでは、というもの。それだとJavaみたいに型付けの甘いASTをトラバースするよう精神衛生上よろしくない処理を行わなくてすむので、幸せな気がします。

また、「ASTのノードなんてboost::tuple及びboost::variantでいいんじゃねーの」、という気もしなくもありません。どうせすぐ捨てるんだし。その場合メンバに名前をつけられないというデメリットがありますが、コンストラクタすら書かなくていいというメリットがあります。MLの多相型なんてもともとそんなんだしなあ。

というわけで、今現在は「caperとは別に、ocamlの多相型定義のような入力ファイルを与えるとboost::tuple+boost::variantなASTの定義ファイルをはいてくれるジェネレータを作る」方向に気持ちが傾いています。