V10/vol2/yacc/xtags

#    Extract tag and label definitions.
grep -h "^\.@" $* >xref.tmp

#    Create commands for replacing tags, and check for redeclarations.
awk '
 $1==".@defpre"	{ defpre = $2;
		  for (x in value) value[x] = 0;
		}
 $1==".@pre"	{ pre[$2] = $3; value[$2] = 0;
		}
 $1==".@label"	{ check($2, $1);
		} 
 $1==".@tag"	{ check($3, $1);
		  if ($2 in pre) temp = pre[$2]; else temp = defpre;
		  if (NF >= 4) number = $4; else number = ++value[$2];
		  p[substr($3,1,3)] = p[substr($3,1,3)]\
			sprintf("s/%s/%s%d/g\n",$3, temp, number);
		}
 END		{ for (x in p) print "/" x "/{\n" p[x] "}";
		  printf "/^\\.@tag/d\n"
		}
 func check(name,cmd) {
    if (seen[name])
        system( "echo "name" redeclared in "cmd" 1>&2" );
    else seen[name] = 1;
 }
' xref.tmp


rm xref.tmp