tokenizerを書いてみる

 本格的に書くなら yacc, lex(Python環境だと、PLYモジュール)などを用いるのが妥当かと思いますが、正直本格的過ぎて覚えるのもかなりの苦労を伴います..
 なので、まずは簡単なtokenizerを自分で書いてみることに。

 参考にしたのは『スモールコンパイラの制作で学ぶプログラムのしくみ 著・石田綾 監修・中田育男 ISBN4-7741-2177-0 C3055』という本。
 javaベースで独自の言語体系のコンパイラを書きながらプログラムやコンピュータの動作を知る、という趣旨の本です。タイトル通りですね。

 細かいことは置いておき、書いたのが以下のコード。

 CharReaderでファイルを読み込み、内容を1文字ずつ取得。
 LexerとCharClassで、文字を分類。
 Tokenizerで、ひとかたまりのtokenを取得。

 これだけのことなのに、結構だらだらと書くことになってしまいました..

 実際は、切り出したtokenがどんな並びで記述されているのか構文解析器を通し、意味のある形に変換する必要があるけど..
 先が長そうなので、今回はこれだけ。

Pythonのクラスと継承

メモ。

多重継承時に、継承クラスの__init__関数呼び出しをどうするんだっけ..と思ったので調べてみた。

(参考)
Python の super のメリットとデメリット
Python>多重継承の2番目以降の親クラスを呼ぶ

まず以下のように単純な継承をさせると、 クラス’C’の__init__関数だけが実行されることが判る。

なので、継承するクラスで継承元を呼ぶようにしてみると、以下のように動く。

ダイヤモンド継承だと、こんな動きに。

superを使えば、良きに計らってくれる。
ただ、クラス毎に__init__関数に異なる引数が必要な場合には、うまくはいかない。

この場合は no-superな記述が必要になるので、多重初期化が起こっても平気な設計にしてあげないといろいろ変な問題が発生する..可能性もある。らしい..

no-superな記述はこんな感じ。

じゃあ、B1, B2それぞれAに異なる初期値を渡しておき、AのvalueをB1,B2それぞれで取得する関数を付けてみたら、こんな感じ。

メンバ変数のvalueはあくまでクラスに1個しかないので、後から処理される方が最終的な値になった。

あんまり継承バリバリ使わないけど、多重初期化で問題起こるとしたら、そもそもその設計って継承すべきじゃないものを継承してるような気もする..
そもそも継承深すぎるとネストが深いのと同じにいろいろ弊害出そうなので、継承は2レベル程度にしつつ、多重継承よりもメンバにクラスのインスタンスを含める実装にする方が幸せかも。

シェーダー、シェーディンググループ(SG)、SGに含まれるジオメトリの取得

めも。

【その後】
 デフォルトのシェーダーだったら行けるけど、cgfxShaderとかはもう駄目だった..
 シェーダーはタイプ定義が結構まちまちな気がする..単にshadingGroupのsurfaceMaterialとかのアトリビュートに繋がっているのを調べた方が良いかもしれない。

その後のその後

 cmds.ls(mat=True) でマテリアルを収集できるので、これを基準にSG取得とかすれば何とかなりそうな気がしてきた。