我正在使用一个多面体编译器,该编译器会产生非常不可读的代码,这是一个小示例:
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]);;