LSLでプリプロセッサ

れむ

2008年05月18日 14:18


LSLでCやC++はでお馴染みのプリプロセッサを使ってみました。

プリプロセッサでは主に次のようなことができます。
・文字置換/マクロ展開
・外部ファイルの読み込み
・ソースの条件選択

詳しいことは検索すればたくさん出てきますので調べてもらえればと思います。

プリプロセッサを使うことでの一番の恩恵と言えば、
複数ファイルで定数を共有化することができるということでしょうか。
変数の値は共有化できませんが、関数なども簡単に使い回せるようになります。

使うプリプロセッサは何でもいいのですが、
今回はBorland C++ Compilerに含まれているものを使用します。
5.5であればユーザー登録すれば無料で利用できます。(以前は登録なしでダウンロードできた気がします)
ダウンロードしたらその中からcpp32.exeを取り出します。
これがプリプロセッサです。

あとは構文チェック用にlslintもダウンロードしておきましょう。

プリプロセッサの使い方ですが、
コマンドラインからの利用となりますので次のようなバッチファイルを用意しました。
これをコピペして適当なファイル名を付けて保存し、
そのバッチファイルにLSLファイルを投げ込めばプリプロセスと構文チェックを行ってくれます。
cpp32とlslintとバッチファイルは同じディレクトリに置いて下さい。
@ECHO OFF SET OUTPUT_DIR=dst SET CPP32_PATH=. SET LSLINT_PATH=. IF NOT EXIST "%OUTPUT_DIR%">nul MKDIR %OUTPUT_DIR% FOR /F %%I IN ("%1") DO SET BASE_NAME=%%~nI "%CPP32_PATH%\cpp32.exe" -P- -Sr -Sk -n"%OUTPUT_DIR%" "%1">nul "%LSLINT_PATH%\lslint.exe" "%OUTPUT_DIR%\%BASE_NAME%.i" PAUSE

このまま使用すると
バッチファイルのあるフォルダにdstフォルダを作成し、
その下に変換後のファイルを出力します。
変換されたファイル名は.iになっています。
スクリプトにはこのファイルの中身を使用します。


但しこの方法にはデメリットもあります。
・エラー行がずれる。
・スクリプトが別ファイルになるので面倒。

cpp32の制限事項として以下のものもあります。
(オプションの指定方法が悪いのかも知れません)
・jumpを使用すると@でプリプロセスエラーが出る。
・コメントが消えたり、ソースレイアウトが崩れる。

変換後のソースを直接変更することはないと思いますのでコメント等は入らないと思いますが、
エラーの場所が探しにくくなるのは致命的です。

プリプロセッサにgccを使えばjump使用時のエラーはでません。
ですが、gccを使用するためにはcygwinなどをインストールする必要があるので
かなり手間になってしまいます。

ちなみにバッチファイルは後半をこんな感じにすれば動くと思います。
FOR /F %%I IN ("%1") DO (
	SET BASE_NAME=%%~nI
	SET BASE_PATH=%%~dpI
)
COPY %1 "%OUTPUT_DIR%\%BASE_NAME%.h">nul
PATH=%PATH%;C:\cygwin\bin\
gcc -P -E -C -I%BASE_PATH% "%OUTPUT_DIR%\%BASE_NAME%.h">"%OUTPUT_DIR%\%BASE_NAME%.lsl"
"%LSLINT_PATH%\lslint.exe" "%OUTPUT_DIR%\%BASE_NAME%.lsl"

正直、普通にスクリプトを書く分にはデメリットの方が大きいとは思います。
プリプロセッサの副作用についても注意が必要になりますしね。


なお、バッチファイルの動作等は保証致しませんのでご了承下さい。
また使い易いように編集してもらえればと思います。
スクリプト