[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 1563] Re: ASKAのプリプロセッサ(Re: atropos3).



小柳です。こんばんは。

うれしいお知らせです。

Hidemi KAWAI wrote:
> 
>   こんにちは、川合です。
> 

>   ここで、みなさんに質問です。C言語用のプリプロセッサで、プリプ
> ロセスのみを機能させられて、フリーで、しかもあまり大きくない、プ
> リプロセッサって無いでしょうか?あったら、ASKAの前にそれで処理す
> ることにして、すぐに#defineや条件コンパイルなどが使えるようにな
> るんですが・・・。ご存知でしたら、是非教えてください。

見つけました!!しかもすぐ目の前に。

lcc を -EP オプションを付けて実行するとプリプロセッサとして
動かすことができます。コンパイルは以下のような手順になります。

lcc -EP -I. -DDEBUG s_world.ask
aska s_world.i s_world.3as
以後はこれまでと同じ。

http://homepage1.nifty.com/dreaming/osask/index.html

の sworld を #define や #include を使ってソース分割をしたので
ぜひ見て下さい。ソースがこんな風に書けます。

---
// "s_world.ask"   copyright(C) 2001 M.Koyanagi (小柳雅明)
//  参照ソース "music2.ask"   copyright(C) 2000 H.Kawai (川合秀実)
// 「広がる小さな世界」 music by M.Koyanagi (小柳雅明) copyright(C) June
29,1996
// stack & work size
#define STACK_AND_WORK_SIZE 0x2000  /* 8KB */

#include <guigui00.ask>

struct WORK {
        LIB_Init lib_init;
..
}
void main(void)
{
	LEA(EBX, (int) work->lib_init);
	LIBCALL();
}
---

また makeat10 もプリプロセッサを使用するように変更しました。

以下は注意点です。

(1)Shift JIS の漢字コメント
 lcc は Shift JIS を考慮していません。
「能」, 「表」などの文字は SJIS では 2バイト目が '\' になるため、
行末がこれらの文字だと次の行とくっついてしまいます。例えば、

A;// これで xx が実行可能
B;// 次にこうする
C;// 最後にこうする

の処理結果が

C;

となってしまいます。

対策としてコメント行の終わりが漢字になる場合は後ろに ' ' スペースを
追加するくせを付けた方が良いです。 また 「漢字」 と "*/" の間にも
スペースを入れましょう。


(2)コメントの入れ子の禁止
lcc -EP のプリプセッサは /* */ の入れ子に対応していません。
/*
 A; /* comment */
 B; /* comment */
*/
のようにすると処理結果が
 B;
*/
となってしまいます。ソースの無効化としては
#if 0
#endif
を使いましょう。makeat10 ではこの置換を行っています。
(base.exe をビルドするのに必要な init.ask 内では特にたくさん使われて
いました。)

(3)#define の定義は大文字で

#define libcall() DB(0x9a); DD(0); DW(0x00c7)

では libcall() が置換されませんでした。

#define LIBCALL() DB(0x9a); DD(0); DW(0x00c7)

と大文字を使わないと駄目みたいです。

(4)行番号の問題
ヘッダファイルをインクルードすると ASKA の出すエラーの行番号と
 .ask の対応する行番号が当然ずれてしまいます。
現状は .i ファイルでエラーの場所を確認してから .ask ファイルの対応する
場所を修正することになります。
-EP オプションの替わりに -E とすれば 
# 行番号
という形でオリジナルの .ask ソースの行番号の対応が出力されるのですが、
ASKA が現状ではこの出力を理解できないので使えません。


  注意点の中でも(4)の問題は少しやっかいですが、それでも lcc が
 ASKA のプリプロセッサとして使えるのは非常に有用だと思います。
pack005s のASKAのアプリケーションでは、ぜひプリプロセッサを使う形での
ソース収録としたいです。私が既存のソース countup4 や boxes01 を
書き換えても良いです。


 それにしても私は [OSASK 1428]で

> 残念ながら、そういうのは知らないのですが、最低限のものなら
> Perlで書けばなんとかなるかもしれません。
> #gccは大きすぎですよね。

と書いていて gcc -E でプリプロセッサとして使えるのを知っていたのに、
 lcc のオプションをもっと早くチェックするべきでした。

-- 
小柳 雅明(Koyanagi.Masaaki !Atmark! nifty.ne.jp)
「人の足を止めるのは"絶望"ではなく"諦観"
  人の足を進めるのは"希望"ではなく"意志"」
                  -- ARMS