work in progress: Convering RSL into AST

by syoyo

[En]

This post is a work-in-progress report of
my RSL(RenderMan Shading Language) to LLVM converter using ANTLR v3.
Now I’ve finished writing some AST construction for RSL code facility in my converter.

http://lucille.atso-net.jp/svn/angelina/shaderlang/

Here is a example input RSL code.


surface
checker(float Kd = .5,
              Ka = .1,
              frequency = 10;
        color blackcolor = color(0, 0, 0))
{
        float smod = mod(s * frequency, 1),
              tmod = mod(t * frequency, 1);

        if (smod < 0.5) {
                if  (tmod < 0.5) {
                        Ci = Cs;
                } else {
                        Ci = blackcolor;
                }
        } else {
                if  (tmod < 0.5) {
                        Ci = blackcolor;
                } else {
                        Ci = Cs;
                }
        }

        Oi = Os;
        Ci = Oi * Ci * (
             Ka * ambient() +
             Kd * diffuse(faceforward(normalize(N), I)));
}

Then, this is converted into AST format using my translator and got a result such like…


$ ./run.sh shaders/checker.sl
(DEF_SHADER surface checker (VAR float Kd (INIT .5)) (VAR float Ka
(INIT .1)) (VAR float frequency (INIT 10)) (VAR color blackcolor
(INIT color ( 0 , 0 , 0 ))) (VAR float smod (INIT (FUNC mod (ARG
(* s frequency)) (ARG 1)))) (VAR float tmod (INIT (FUNC mod (ARG
(* t frequency)) (ARG 1)))) (if (< smod 0.5) (STMT (if (< tmod 0.5)
(STMT (= Ci Cs)) (STMT (= Ci blackcolor)))) (STMT (if (< tmod 0.5)
(STMT (= Ci blackcolor)) (STMT (= Ci Cs))))) (= Oi Os) (= Ci (*
(* Oi Ci) (+ (* Ka (FUNC ambient)) (* Kd (FUNC diffuse (ARG
(FUNC faceforward (ARG (FUNC normalize (ARG N))) (ARG I)))))))))

Next step is to writing down AST to LLVM code using StringTemplate or ocaml(?).

[Ja]

ANTLR 本を見ながら、とりあえず RSL to LLVM コンバータの中間ステップである、
AST(抽象構文木)を作るところらへんが出来始めてきました。

ANTLR には StringTemplate で文字列テンプレートを扱える機能があって
(StringTemplate というツール自体は独立している)、
それを使うと tree をトラバースして出力するときに、
出力文字の整形操作などの処理が楽に書けるようになっています。
(これは Python などのスクリプト言語に搭載されている文字列テンプレートと機能は同じようです。
ANTLR の C ランタイムでは StringTemplate は使えないですが)

まあ AST 文字列さえ生成できればあとは ANTLR に頼らずとも、
各種いろいろなツールが使えると思います。 Python やら ocaml などで
AST に対してパターンマッチングとかするのもいいかも。

次なるステップは, LLVM IR [1] を調べて, AST をこの形式に書き出すところをやりたいと思います。

[1] http://llvm.org/docs/LangRef.html

Advertisements