私は非常に読みにくいコードを生成する多面体コンパイラを使用していました。ここに小さなサンプルがあります:
for (t2=2*t1;t2<=min(floord(2*T+N-3,32),floord(64*t1+N+61,32));t2++) {
for (t3=max(ceild(32*t2-N-27,32),2*t1);t3<=min(min(floord(2*T+N-3,32),floord(64*t1+N+61,32)),floord(32*t2+N+27,32));t3++) {
if ((t1 <= floord(32*t3-N+1,64)) && (t2 <= t3-1)) {
if ((N+1)%2 == 0) {
for (t5=max(32*t2,32*t3-N+4);t5<=32*t2+31;t5++) {
a[-32*t3+t5+N-2][N-2]=b[-32*t3+t5+N-2][N-2];;
}
}
}
if ((t1 <= floord(32*t2-N+1,64)) && (t2 >= t3)) {
if ((N+1)%2 == 0) {
for (t6=max(32*t3,32*t2-N+4);t6<=min(32*t2,32*t3+31);t6++) {
a[N-2][-32*t2+t6+N-2]=b[N-2][-32*t2+t6+N-2];;
}
}
}
生成されたコードの算術式を配列インデックスの printf に変換することで、コンパイラの一部をデバッグしようとしていました。たとえば、次の式です。
a[-32*t3+t5+N-2][N-2]=b[-32*t3+t5+N-2][N-2];;
このprintfになるはずです:
printf("a[%d][%d] = b[%d][%d]\n",-32*t3+t5+N-2,N-2,-32*t3+t5+N-2,N-2);
私は awk を試してみて、変更する文字列を識別し、プログラムの残りの部分を変更しないようにするこの単純なプログラムを作成しました。
awk '{if ($0 ~ "^[ ]*[a,b]") print "printf("; else print $0;}'
ただし、配列アクセスのインデックスを削除しながら、その構造を残すために算術式を解析する方法がわかりません。while ループを試してみましたが、今のところ行き詰まっています。awk はそのような置換を行うことができるはずですが、他の言語での提案は大歓迎です!
update算術式は、次のような任意の算術式にすることができます。
b[t3][t4]=0.2*(a[t3][t4]+a[t3][t4-1]+a[t3][1+t4]+a[1+t3][t4]+a[t3-1][t4]);;