src/Pure/Isar/keyword.scala
author wenzelm
Wed, 05 Nov 2014 16:57:12 +0100
changeset 58900 1435cc20b022
parent 58868 c5e1cce7ace3
child 58901 47809a811eba
permissions -rw-r--r--
explicit type Keyword.Keywords;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36947
285b39022372 renamed Outer_Keyword to Keyword (in Scala);
wenzelm
parents: 36681
diff changeset
     1
/*  Title:      Pure/Isar/keyword.scala
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     3
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
     4
Isar keyword classification.
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     5
*/
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     6
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     7
package isabelle
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     8
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
     9
36947
285b39022372 renamed Outer_Keyword to Keyword (in Scala);
wenzelm
parents: 36681
diff changeset
    10
object Keyword
32450
375db037f4d2 misc tuning;
wenzelm
parents: 29450
diff changeset
    11
{
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    12
  /** keyword classification **/
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    13
36681
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    14
  /* kinds */
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    15
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    16
  val MINOR = "minor"
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    17
  val DIAG = "diag"
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    18
  val HEADING = "heading"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    19
  val THY_BEGIN = "thy_begin"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    20
  val THY_END = "thy_end"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    21
  val THY_DECL = "thy_decl"
58800
bfed1c26caed explicit keyword category for commands that may start a block;
wenzelm
parents: 57837
diff changeset
    22
  val THY_DECL_BLOCK = "thy_decl_block"
48867
e9beabf045ab some support for inlining file content into outer syntax token language;
wenzelm
parents: 46969
diff changeset
    23
  val THY_LOAD = "thy_load"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    24
  val THY_GOAL = "thy_goal"
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    25
  val QED = "qed"
53571
e58ca0311c0f more explicit indication of 'done' as proof script element;
wenzelm
parents: 53371
diff changeset
    26
  val QED_SCRIPT = "qed_script"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    27
  val QED_BLOCK = "qed_block"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    28
  val QED_GLOBAL = "qed_global"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    29
  val PRF_GOAL = "prf_goal"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    30
  val PRF_BLOCK = "prf_block"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    31
  val PRF_OPEN = "prf_open"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    32
  val PRF_CLOSE = "prf_close"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    33
  val PRF_CHAIN = "prf_chain"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    34
  val PRF_DECL = "prf_decl"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    35
  val PRF_ASM = "prf_asm"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    36
  val PRF_ASM_GOAL = "prf_asm_goal"
53371
47b23c582127 more explicit indication of 'guess' as improper Isar (aka "script") element;
wenzelm
parents: 51274
diff changeset
    37
  val PRF_ASM_GOAL_SCRIPT = "prf_asm_goal_script"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    38
  val PRF_SCRIPT = "prf_script"
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    39
36681
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    40
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    41
  /* categories */
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    42
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    43
  val diag = Set(DIAG)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    44
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    45
  val heading = Set(HEADING)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    46
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    47
  val theory = Set(THY_BEGIN, THY_END, THY_LOAD, THY_DECL, THY_DECL_BLOCK, THY_GOAL)
57837
63e3c45b85e1 removed unused stuff;
wenzelm
parents: 57836
diff changeset
    48
58800
bfed1c26caed explicit keyword category for commands that may start a block;
wenzelm
parents: 57837
diff changeset
    49
  val theory_block = Set(THY_BEGIN, THY_DECL_BLOCK)
bfed1c26caed explicit keyword category for commands that may start a block;
wenzelm
parents: 57837
diff changeset
    50
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    51
  val theory_body = Set(THY_LOAD, THY_DECL, THY_DECL_BLOCK, THY_GOAL)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    52
40456
e91b3c2145b4 added missing Keyword.THY_SCHEMATIC_GOAL;
wenzelm
parents: 38236
diff changeset
    53
  val proof =
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    54
    Set(QED, QED_SCRIPT, QED_BLOCK, QED_GLOBAL, PRF_GOAL, PRF_BLOCK, PRF_OPEN, PRF_CLOSE,
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    55
      PRF_CHAIN, PRF_DECL, PRF_ASM, PRF_ASM_GOAL, PRF_ASM_GOAL_SCRIPT, PRF_SCRIPT)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    56
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    57
  val proof_body =
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    58
    Set(DIAG, HEADING, PRF_BLOCK, PRF_OPEN, PRF_CLOSE, PRF_CHAIN, PRF_DECL, PRF_ASM,
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    59
      PRF_ASM_GOAL, PRF_ASM_GOAL_SCRIPT, PRF_SCRIPT)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    60
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    61
  val theory_goal = Set(THY_GOAL)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    62
  val proof_goal = Set(PRF_GOAL, PRF_ASM_GOAL, PRF_ASM_GOAL_SCRIPT)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    63
  val qed = Set(QED, QED_SCRIPT, QED_BLOCK)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    64
  val qed_global = Set(QED_GLOBAL)
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    65
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    66
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    67
  type Spec = ((String, List[String]), List[String])
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    68
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    69
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    70
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    71
  /** keyword tables **/
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    72
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    73
  object Keywords
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    74
  {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    75
    def empty: Keywords = new Keywords()
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    76
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    77
    def apply(names: List[String]): Keywords =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    78
      (empty /: names)({ case (keywords, a) => keywords + (a, (MINOR, Nil)) })
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    79
  }
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    80
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    81
  class Keywords private(
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    82
    keywords: Map[String, (String, List[String])] = Map.empty,
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    83
    val minor: Scan.Lexicon = Scan.Lexicon.empty,
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    84
    val major: Scan.Lexicon = Scan.Lexicon.empty)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    85
  {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    86
    /* content */
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    87
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    88
    override def toString: String =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    89
      (for ((name, (kind, files)) <- keywords) yield {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    90
        if (kind == MINOR) quote(name)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    91
        else
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    92
          quote(name) + " :: " + quote(kind) +
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    93
          (if (files.isEmpty) "" else " (" + commas_quote(files) + ")")
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    94
      }).toList.sorted.mkString("keywords\n  ", " and\n  ", "")
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    95
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    96
    def is_empty: Boolean = keywords.isEmpty
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    97
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    98
    def + (name: String, kind: (String, List[String])): Keywords =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    99
    {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   100
      val keywords1 = keywords + (name -> kind)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   101
      val (minor1, major1) =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   102
        if (kind._1 == MINOR) (minor + name, major) else (minor, major + name)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   103
      new Keywords(keywords1, minor1, major1)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   104
    }
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   105
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   106
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   107
    /* kind */
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   108
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   109
    def kind(name: String): Option[String] = keywords.get(name).map(_._1)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   110
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   111
    def command_kind(token: Token, pred: String => Boolean): Boolean =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   112
      token.is_command &&
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   113
        (kind(token.source) match { case Some(k) => k != MINOR && pred(k) case None => false })
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   114
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   115
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   116
    /* load commands */
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   117
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   118
    def load_command(name: String): Option[List[String]] =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   119
      keywords.get(name) match {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   120
        case Some((THY_LOAD, exts)) => Some(exts)
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   121
        case _ => None
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   122
      }
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   123
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   124
    private lazy val load_commands: List[(String, List[String])] =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   125
      (for ((name, (THY_LOAD, files)) <- keywords.iterator) yield (name, files)).toList
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   126
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   127
    def load_commands_in(text: String): Boolean =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   128
      load_commands.exists({ case (cmd, _) => text.containsSlice(cmd) })
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   129
  }
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
   130
}
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
   131