53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

来訪ありがとうございます
シストレツールを自作してました
自分用の記事が多いのであまり役には立たないブログでした

f:id:sucar:20150414193802p:plain

自作システム詳細目次

sedで強引にインクルード処理

sed にrコマンドというのがありinclude処理的なことができます

現在の自作シストレシステムの自作言語(DSL:Esgrsdnlと命名)のコンパイル処理の流れ図

f:id:sucar:20200716210855p:plain

インクルード処理に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できるファイルがあって

f:id:sucar:20200718094705p:plain

このうち 末尾が"__"のファイルが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__

は消える

 

正規表現はややこしいですがテクニック的には

 sed正規表現のアドレス部分に / があるので

/~/の代わりに¥:~:を使って

ただawkのprintf文""のなかで¥がエスケープされるので¥¥にしとく

とか

^[ \t]*//

としてるので,

行頭 0個以上の空白文字後の//が対象になるので

コメントアウトしたければ

; //#__05cOR00__
または
// //#__05cOR00__

コメントアウトできる

ややこしい