| author | wenzelm | 
| Thu, 04 Apr 2013 18:06:48 +0200 | |
| changeset 51617 | 4e49bba9772d | 
| parent 51274 | cfc83ad52571 | 
| permissions | -rwxr-xr-x | 
| 35022 
c844b93dd147
modernized perl scripts: prefer standalone executables;
 wenzelm parents: 
33684diff
changeset | 1 | #!/usr/bin/env perl | 
| 24875 | 2 | # | 
| 3 | # Author: Makarius | |
| 4 | # | |
| 5 | # keywords.pl - generate outer syntax keyword files from session logs | |
| 6 | # | |
| 7 | ||
| 35022 
c844b93dd147
modernized perl scripts: prefer standalone executables;
 wenzelm parents: 
33684diff
changeset | 8 | use warnings; | 
| 
c844b93dd147
modernized perl scripts: prefer standalone executables;
 wenzelm parents: 
33684diff
changeset | 9 | use strict; | 
| 
c844b93dd147
modernized perl scripts: prefer standalone executables;
 wenzelm parents: 
33684diff
changeset | 10 | |
| 
c844b93dd147
modernized perl scripts: prefer standalone executables;
 wenzelm parents: 
33684diff
changeset | 11 | |
| 24886 | 12 | ## arguments | 
| 24875 | 13 | |
| 33684 | 14 | my ($keywords_name, $sessions) = @ARGV; | 
| 24875 | 15 | |
| 16 | ||
| 17 | ## keywords | |
| 18 | ||
| 19 | my %keywords; | |
| 20 | ||
| 21 | sub set_keyword {
 | |
| 22 | my ($name, $kind) = @_; | |
| 27386 | 23 |   if (defined $keywords{$name} and $keywords{$name} ne $kind and $keywords{$name} ne "minor") {
 | 
| 24 |     if ($kind ne "minor") {
 | |
| 25 |       print STDERR "### Inconsistent declaration of keyword \"${name}\": $keywords{$name} vs ${kind}\n";
 | |
| 26 |       $keywords{$name} = $kind;
 | |
| 27 | } | |
| 28 |   } else {
 | |
| 29 |     $keywords{$name} = $kind;
 | |
| 24875 | 30 | } | 
| 31 | } | |
| 32 | ||
| 46967 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 33 | my %convert_kinds = ( | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 34 | "thy_begin" => "theory-begin", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 35 | "thy_end" => "theory-end", | 
| 46969 | 36 | "thy_heading1" => "theory-heading", | 
| 37 | "thy_heading2" => "theory-heading", | |
| 38 | "thy_heading3" => "theory-heading", | |
| 39 | "thy_heading4" => "theory-heading", | |
| 48864 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 wenzelm parents: 
46969diff
changeset | 40 | "thy_load" => "theory-decl", | 
| 46967 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 41 | "thy_decl" => "theory-decl", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 42 | "thy_script" => "theory-script", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 43 | "thy_goal" => "theory-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 44 | "qed_block" => "qed-block", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 45 | "qed_global" => "qed-global", | 
| 46969 | 46 | "prf_heading2" => "proof-heading", | 
| 47 | "prf_heading3" => "proof-heading", | |
| 48 | "prf_heading4" => "proof-heading", | |
| 46967 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 49 | "prf_goal" => "proof-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 50 | "prf_block" => "proof-block", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 51 | "prf_open" => "proof-open", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 52 | "prf_close" => "proof-close", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 53 | "prf_chain" => "proof-chain", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 54 | "prf_decl" => "proof-decl", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 55 | "prf_asm" => "proof-asm", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 56 | "prf_asm_goal" => "proof-asm-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 57 | "prf_script" => "proof-script" | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 58 | ); | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 59 | |
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 60 | my @emacs_kinds = ( | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 61 | "major", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 62 | "minor", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 63 | "control", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 64 | "diag", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 65 | "theory-begin", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 66 | "theory-switch", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 67 | "theory-end", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 68 | "theory-heading", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 69 | "theory-decl", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 70 | "theory-script", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 71 | "theory-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 72 | "qed", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 73 | "qed-block", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 74 | "qed-global", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 75 | "proof-heading", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 76 | "proof-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 77 | "proof-block", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 78 | "proof-open", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 79 | "proof-close", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 80 | "proof-chain", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 81 | "proof-decl", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 82 | "proof-asm", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 83 | "proof-asm-goal", | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 84 | "proof-script" | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 85 | ); | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 86 | |
| 24875 | 87 | sub collect_keywords {
 | 
| 88 |   while(<STDIN>) {
 | |
| 50714 | 89 |     if (m/^\fOuter syntax keyword "([^"]*)" :: (\S*)/) {
 | 
| 46967 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 90 | my $name = $1; | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 91 | my $kind = $2; | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 92 |       if (defined $convert_kinds{$kind}) { $kind = $convert_kinds{$kind} }
 | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 93 | &set_keyword($name, $kind); | 
| 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 94 | } | 
| 50714 | 95 |     elsif (m/^\fOuter syntax keyword "([^"]*)"/) {
 | 
| 24875 | 96 | my $name = $1; | 
| 97 | &set_keyword($name, "minor"); | |
| 98 | } | |
| 99 | } | |
| 100 | } | |
| 101 | ||
| 102 | ||
| 103 | ## Emacs output | |
| 104 | ||
| 105 | sub emacs_output {
 | |
| 106 |   my $file = $keywords_name eq "" ? "isar-keywords.el" : "isar-keywords-${keywords_name}.el";
 | |
| 107 |   open (OUTPUT, "> ${file}") || die "$!";
 | |
| 108 | select OUTPUT; | |
| 109 | ||
| 110 | print ";;\n"; | |
| 111 | print ";; Keyword classification tables for Isabelle/Isar.\n"; | |
| 24912 | 112 |   print ";; Generated from ${sessions}.\n";
 | 
| 24905 | 113 | print ";; *** DO NOT EDIT *** DO NOT EDIT *** DO NOT EDIT ***\n"; | 
| 24875 | 114 | print ";;\n"; | 
| 115 | ||
| 46967 
499d9bbd8de9
uniform keyword names within ML/Scala -- produce elisp names via external conversion;
 wenzelm parents: 
36316diff
changeset | 116 |   for my $kind (@emacs_kinds) {
 | 
| 24875 | 117 | my @names; | 
| 118 |     for my $name (keys(%keywords)) {
 | |
| 119 |       if ($kind eq "major" ? $keywords{$name} ne "minor" : $keywords{$name} eq $kind) {
 | |
| 120 |         if ($kind ne "minor" or $name =~ m/^[A-Za-z0-9_]+$/) {
 | |
| 121 | push @names, $name; | |
| 122 | } | |
| 123 | } | |
| 124 | } | |
| 125 | @names = sort(@names); | |
| 126 | ||
| 127 |     print "\n(defconst isar-keywords-${kind}";
 | |
| 128 |     print "\n  '(";
 | |
| 129 | my $first = 1; | |
| 130 |     for my $name (@names) {
 | |
| 131 | $name =~ s/([\.\*\+\?\[\]\^\$])/\\\\$1/g; | |
| 132 |       if ($first) {
 | |
| 133 |         print "\"${name}\"";
 | |
| 134 | $first = 0; | |
| 135 | } | |
| 136 |       else {
 | |
| 137 |         print "\n    \"${name}\"";
 | |
| 138 | } | |
| 139 | } | |
| 140 | print "))\n"; | |
| 141 | } | |
| 142 | print "\n(provide 'isar-keywords)\n"; | |
| 143 | ||
| 144 | close OUTPUT; | |
| 145 | select; | |
| 33684 | 146 |   print STDERR "${file}\n";
 | 
| 24875 | 147 | } | 
| 148 | ||
| 149 | ||
| 150 | ## main | |
| 151 | ||
| 152 | &collect_keywords(); | |
| 33684 | 153 | &emacs_output(); |