トップ 最新

kumaryu日記

2010-06-22

_ [Ruby] GLSLパーサ作り続き

GLSLパーサ。というかプリプロセッサ。まだプリプロセッサやってんのかよ!

ifディレクティブの式はパース時に構文木にしちゃった方がいいわーと頑張ってたんだが、まあなんとなく出来た気がするんだが、評価前にはマクロ展開しないといけなくて、マクロ展開は当然パース後なわけで、展開されたマクロは当然構文木じゃなくただのトークン列なわけで…じゃあマクロ展開してから解析しないと評価できねーじゃん!!

…元に戻すか。

式の部分はトークン列のままにしといて、マクロ展開してからあらためて文法解析しないとだめね。

プリプロセッサめんどくせーなー。

ということはTreetopに文字列じゃなくてトークン列渡せるように改造もしないといけないのか。いつかはやることだったけどめんどくせーなー。

どこいじればいいんだっけ?Treetop::Runtime::CompiledParser#has_terminal?と、Treetop::Compiler::Terminal#compileか。

調べてたらcitrusってのがあった。似たような感じだけど、こっちの方がシンプルでいじりやすそう。

ただしcitrusはcitrusファイルを読み込んだら即時evalしか出来なくてrubyコードに変換しておくのができないようだ。まあそこは必要になってから作ればいいかな。

ちょっとcitrusいじってみよう。