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

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

本家はこちら↓
f:id:sucar:20151115183011p:plain

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます
自分用の記事が多いのであまり役には立たないブログでしたが
2018/10月以降、多少は役立つブログになるかもしれません

f:id:sucar:20150414193802p:plain

awk sed を駆使してm4マクロを自動生成

改定版)

自作システムのストラテジー記述でマクロが使えるようにしている(m4マクロ)

で・・・

マクロを記述するのが結構面倒

そこで、マクロのテンプレートファイルを準備して

./m4_XX2.m4

define(`ExXXp',`_xx_')dnl
dnl pXX pXX(N) pXX(d,u) pXX(d,u,N) pXX(d,u,N,s)
define(`pXX',`ifelse(`$#', `0',`_P_	dmy	dmy	ExXX		ExXXp(0)	dmy$0
',`$#', `1',`_P_	dmy	dmy	ExXX$1	ExXXp($1)	dmy$0
',`$#', `2',`_P_	$1	$2	ExXX		ExXXp(0)	dmy$0
'          ,`_P_	$1	$2	ExXX$3$4	ExXXp($3)	dmy$0
')')dnl
dnl pXXd=pXX pXXd(d) pXXd(d,N)  pXXd(d,N,s)
define(`pXXd',`ifelse(`$#', `0',`_P_	dmy	dmy	ExXX		ExXXp(0)	dmy$0
',`$#', `1',`_P_	_min_	$1	ExXX		ExXXp(0)	dmy$0
'          ,`_P_	_min_	$1	ExXX$2$3	ExXXp($2)	dmy$0
')')dnl
dnl pXXu=pXX pXXu(u) pXXu(u,N) pXXu(u,N,s)
define(`pXXu',`ifelse(`$#', `0',`_P_	dmy	dmy	ExXX		ExXXp(0)	dmy$0
',`$#', `1',`_P_	$1	_max_	ExXX		ExXXp(0)	dmy$0
'          ,`_P_	$1	_max_	ExXX$2$3	ExXXp($2)	dmy$0
')')dnl

これの

  • XXをパラメタ名に
  • _xx_をパラメタの式表現に
  • _min_をデフォルト時のminの値に
  • _max_をデフォルト時のmaxの値に

置換すれば、マクロが自動生成される仕組み

置換にはsedを使うが、sedスクリプトawkで生成する(ややこしい)

../awk/mkm4_2.awk

$1!=NULL && $2!=NULL {
	if ($3=="") MIN="-80" 
	else MIN=$3+""
	if ($4=="") MAX="80" 
	else MAX=$4+""
	printf("cat ./m4_XX2.m4 |sed -e 's/XX/%s/g;s:_xx_:%s:g;s/_min_/%s/g;s/_max_/%s/g' >./m4/m4_%s.m4\n",$1,$2,MIN,MAX,$1)
}

 こんなawkスクリプトを準備して

./mkm4

echo cd `dirname $0`
cd `dirname $0`
pwd

cat <<EOF |sed -e 's/\[N/\[\$1/g' | awk -f ../awk/mkm4_2.awk  >./mkm4byawk

A	-(hei25[N]-owa[N])/owa[N]*100
B	-(hei5[N]-owa[N])/owa[N]*100
R	(owa[N]-hjm[N])/hjm[N]*100
Z	(owa[N]-hjm[N+1])/hjm[N+1]*100
ZT	(tak[N]-hjm[N+1])/hjm[N+1]*100
DpD	da[N]/da[N+1]	0	1000000
OW	owa[N]	1	1000000
D	da[N]	0	1000000000000

EOF
./mkm4byawk

 というshell scriptを走らせるとマクロを自動生成する(ややこしい)

here documents を活用して、パラメタをズラズラ直接記述すれば、パラメタ追加が簡単

便利になったけど、ややこしい・・・・