1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#!/usr/bin/perl
#
# Or perhaps: /usr/local/bin/perl
#
# # $Id$
#
undef $/;
if($#ARGV<$[) {die "No Files\n";}
open(tagfile,">TAGS") || die "Couldn't open TAGS: $!\n";
while(<>)
{
print "Tagging $ARGV\n";
$a=$_;
$cp=1;
$lp=1;
$tagstring="";
while(1)
{
# ---- Get the next statement starting on a newline ----
if($a=~/^[ \t\n]*\(\*/)
{ while($a=~/^\s*\(\*/)
{ $d=1; $a=$'; $cp+=length $&; $lp+=(($wombat=$&)=~tr/\n/\n/);
while($d>0 && $a=~/\(\*|\*\)/)
{ $a=$'; $cp+=2+length $`; $lp+=(($wombat=$`)=~tr/\n/\n/);
if($& eq "(*") {$d++} else {$d--};
}
if($d!=0) {die "Unbalanced Comment?";}
}
}
if($cp>1 && $a=~/.*\n/) {$a=$'; $cp+=length $&; $lp++;}
while($a=~/^\n/) {$cp++;$lp++;$a=$'}
if($a=~/^[^\.]*\./)
{ $stmt=$&;
$newa=$';
$newcp=$cp+length $&;
$newlp=$lp+(($wombat=$&)=~tr/\n/\n/); }
else { last;}
# ---- The above embarrasses itself if there are semicolons inside comments
# ---- inside commands. Could do better.
# print "----- (",$lp,",",$cp,")\n", $stmt, "\n";
if($stmt=~/^([ \t]*((Fact)|(Goal)|(Lemma)|(Remark)|(Theorem))\s+([\w\']+))\s*:/)
{ $tagstring.=$1."\177".$8."\001".$lp.",".$cp."\n"; }
elsif($stmt=~/^([ \t]*((Axiom)|(Hypothesis)|(Parameter)|(Variable))\s+[\w\']+)/)
{ do adddecs($stmt,$1) }
elsif($stmt=~/^([ \t]*((Definition)|(Fixpoint)|(Inductive))\s+[\w\']+)/)
{ $tagstring.=$1."\177".$6."\001".$lp.",".$cp."\n"; }
$cp=$newcp; $lp=$newlp; $a=$newa;
}
print tagfile "\f\n".$ARGV.",".(length $tagstring)."\n".$tagstring;
}
close tagfile;
sub adddecs {
$wk=$_[0];
$tag=$_[1];
$sep=",";
while($tst=($wk=~/\s*([\w\']+)\s*([,:\[])/) && $sep eq ",")
{ $sep=$2; $tagstring.=$tag."\177".$1."\001".$lp.",".$cp."\n"; $wk=$'; }
0;
}
|