GLSLパーサ。というかプリプロセッサ。まだプリプロセッサやってんのかよ!
ifディレクティブの式はパース時に構文木にしちゃった方がいいわーと頑張ってたんだが、まあなんとなく出来た気がするんだが、評価前にはマクロ展開しないといけなくて、マクロ展開は当然パース後なわけで、展開されたマクロは当然構文木じゃなくただのトークン列なわけで…じゃあマクロ展開してから解析しないと評価できねーじゃん!!
…元に戻すか。
式の部分はトークン列のままにしといて、マクロ展開してからあらためて文法解析しないとだめね。
プリプロセッサめんどくせーなー。
ということはTreetopに文字列じゃなくてトークン列渡せるように改造もしないといけないのか。いつかはやることだったけどめんどくせーなー。
どこいじればいいんだっけ?Treetop::Runtime::CompiledParser#has_terminal?と、Treetop::Compiler::Terminal#compileか。
調べてたらcitrusってのがあった。似たような感じだけど、こっちの方がシンプルでいじりやすそう。
ただしcitrusはcitrusファイルを読み込んだら即時evalしか出来なくてrubyコードに変換しておくのができないようだ。まあそこは必要になってから作ればいいかな。
ちょっとcitrusいじってみよう。