sedで強引にインクルード処理
sed にrコマンドというのがありinclude処理的なことができます
現在の自作シストレシステムの自作言語(DSL:Esgrsdnlと命名)のコンパイル処理の流れ図
インクルード処理に2つあって
- sedによるCompile前の処理
- m4によるAseemble前の処理
注:C言語へのトランスパイルDSLなので本当の意味のComplie Assembleではありません
のうちのsedによる~の方
m4で2回とも処理してもいいのですが2回も通すと変な副作用がある可能性が・・・
なのでsedで・・・・
結局sedも2回通すのでm4でもよかったかもしれませんが・・・
どうもm4のマクロ名が[a-zA-Z_][0-9a-zA-Z_]*しか使えず、かならず
マクロ名(引数,‥)となるのがちょっと好みに合わない・・・
ただ問題があって・・・
処理するソース内にincludeするfile名を直接書けず、sed scriptの方に書くことになる
という・・・
ただ何でもかんでもどこにあるfileでも自由にincludeできる仕様でも好みではないので
includeしたいファイルを置いた時点でコマンド発行して、include処理するscriptを自動生成するようにした
./suQ2/inc/fix にincludeできるファイルがあって
このうち 末尾が"__"のファイルがesgrsdnlで書かれたincludeファイルということにしておいて
$suQ2/mkinc
を実行 中身はshell scriptで
cd `dirname $0` cd ./inc/fix pwd ls *__ | awk '{printf("\\:^[ \\t]*//#__%s:r ./inc/fix/%s\n",$1,$1)}' > ../../esgrs/sedinc.sed
となってる
これで
./suQ2/esgrs/sedinc.sedが生成され 中身は
\:^[ \t]*//#__05c9y00__:r ./inc/fix/05c9y00__ \:^[ \t]*//#__05cOR00__:r ./inc/fix/05cOR00__ \:^[ \t]*//#__mp16_3__:r ./inc/fix/mp16_3__ \:^[ \t]*//#__test__:r ./inc/fix/test__
こうなる
あとはソースに
//#__05cOR00__
と書いておけば
その個所に05cOR00__がincludeされる
ちなみにさらに処理が進むと//~はコメントになるのでソース処理後に
//#__05cOR00__
は消える
正規表現はややこしいですがテクニック的には
/~/の代わりに¥:~:を使って
ただawkのprintf文""のなかで¥がエスケープされるので¥¥にしとく
とか
^[ \t]*//
としてるので,
行頭 0個以上の空白文字後の//が対象になるので
コメントアウトしたければ
; //#__05cOR00__
または
// //#__05cOR00__
でコメントアウトできる
ややこしい