src/Pure/Isar/keyword.scala
author wenzelm
Tue, 04 Apr 2017 23:12:08 +0200
changeset 65385 23f36ab9042b
parent 65384 36255c43c64c
child 66919 1f93e376aeb6
permissions -rw-r--r--
print like syntax of Thy_Header.header;
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 DIAG = "diag"
58999
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    17
  val DOCUMENT_HEADING = "document_heading"
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    18
  val DOCUMENT_BODY = "document_body"
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    19
  val DOCUMENT_RAW = "document_raw"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    20
  val THY_BEGIN = "thy_begin"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    21
  val THY_END = "thy_end"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    22
  val THY_DECL = "thy_decl"
58800
bfed1c26caed explicit keyword category for commands that may start a block;
wenzelm
parents: 57837
diff changeset
    23
  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
    24
  val THY_LOAD = "thy_load"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    25
  val THY_GOAL = "thy_goal"
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    26
  val QED = "qed"
53571
e58ca0311c0f more explicit indication of 'done' as proof script element;
wenzelm
parents: 53371
diff changeset
    27
  val QED_SCRIPT = "qed_script"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    28
  val QED_BLOCK = "qed_block"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    29
  val QED_GLOBAL = "qed_global"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    30
  val PRF_GOAL = "prf_goal"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    31
  val PRF_BLOCK = "prf_block"
60694
b3fa4a8cdb5f clarified text folds: proof ... qed counts as extra block;
wenzelm
parents: 60692
diff changeset
    32
  val NEXT_BLOCK = "next_block"
46967
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    33
  val PRF_OPEN = "prf_open"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    34
  val PRF_CLOSE = "prf_close"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    35
  val PRF_CHAIN = "prf_chain"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    36
  val PRF_DECL = "prf_decl"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    37
  val PRF_ASM = "prf_asm"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    38
  val PRF_ASM_GOAL = "prf_asm_goal"
499d9bbd8de9 uniform keyword names within ML/Scala -- produce elisp names via external conversion;
wenzelm
parents: 46123
diff changeset
    39
  val PRF_SCRIPT = "prf_script"
60624
5b6552e12421 clarified keyword categories;
wenzelm
parents: 59701
diff changeset
    40
  val PRF_SCRIPT_GOAL = "prf_script_goal"
5b6552e12421 clarified keyword categories;
wenzelm
parents: 59701
diff changeset
    41
  val PRF_SCRIPT_ASM_GOAL = "prf_script_asm_goal"
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
    42
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
    43
  val BEFORE_COMMAND = "before_command"
63430
9c5fcd355a2d support for quasi_command keywords;
wenzelm
parents: 63429
diff changeset
    44
  val QUASI_COMMAND = "quasi_command"
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
    45
36681
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    46
59700
d887abcc7c24 more command categories, as in ML;
wenzelm
parents: 59122
diff changeset
    47
  /* command categories */
36681
dffeca08d3bf extractors for outer keyword declarations;
wenzelm
parents: 34166
diff changeset
    48
58999
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    49
  val vacous = Set(DIAG, DOCUMENT_HEADING, DOCUMENT_BODY, DOCUMENT_RAW)
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    50
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    51
  val diag = Set(DIAG)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    52
58999
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    53
  val document_heading = Set(DOCUMENT_HEADING)
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    54
  val document_body = Set(DOCUMENT_BODY)
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    55
  val document_raw = Set(DOCUMENT_RAW)
ed09ae4ea2d8 uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents: 58928
diff changeset
    56
  val document = Set(DOCUMENT_HEADING, DOCUMENT_BODY, DOCUMENT_RAW)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    57
59700
d887abcc7c24 more command categories, as in ML;
wenzelm
parents: 59122
diff changeset
    58
  val theory_begin = Set(THY_BEGIN)
d887abcc7c24 more command categories, as in ML;
wenzelm
parents: 59122
diff changeset
    59
  val theory_end = Set(THY_END)
d887abcc7c24 more command categories, as in ML;
wenzelm
parents: 59122
diff changeset
    60
59701
8ab877c91992 more command categories, as in ML;
wenzelm
parents: 59700
diff changeset
    61
  val theory_load = Set(THY_LOAD)
8ab877c91992 more command categories, as in ML;
wenzelm
parents: 59700
diff changeset
    62
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    63
  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
    64
58800
bfed1c26caed explicit keyword category for commands that may start a block;
wenzelm
parents: 57837
diff changeset
    65
  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
    66
58868
c5e1cce7ace3 uniform heading commands work in any context, even in theory header;
wenzelm
parents: 58853
diff changeset
    67
  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
    68
63479
wenzelm
parents: 63441
diff changeset
    69
  val prf_script = Set(PRF_SCRIPT)
wenzelm
parents: 63441
diff changeset
    70
40456
e91b3c2145b4 added missing Keyword.THY_SCHEMATIC_GOAL;
wenzelm
parents: 38236
diff changeset
    71
  val proof =
60694
b3fa4a8cdb5f clarified text folds: proof ... qed counts as extra block;
wenzelm
parents: 60692
diff changeset
    72
    Set(QED, QED_SCRIPT, QED_BLOCK, QED_GLOBAL, PRF_GOAL, PRF_BLOCK, NEXT_BLOCK, PRF_OPEN,
b3fa4a8cdb5f clarified text folds: proof ... qed counts as extra block;
wenzelm
parents: 60692
diff changeset
    73
      PRF_CLOSE, PRF_CHAIN, PRF_DECL, PRF_ASM, PRF_ASM_GOAL, PRF_SCRIPT, PRF_SCRIPT_GOAL,
60624
5b6552e12421 clarified keyword categories;
wenzelm
parents: 59701
diff changeset
    74
      PRF_SCRIPT_ASM_GOAL)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    75
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    76
  val proof_body =
60694
b3fa4a8cdb5f clarified text folds: proof ... qed counts as extra block;
wenzelm
parents: 60692
diff changeset
    77
    Set(DIAG, DOCUMENT_HEADING, DOCUMENT_BODY, DOCUMENT_RAW, PRF_BLOCK, NEXT_BLOCK, PRF_OPEN,
b3fa4a8cdb5f clarified text folds: proof ... qed counts as extra block;
wenzelm
parents: 60692
diff changeset
    78
      PRF_CLOSE, PRF_CHAIN, PRF_DECL, PRF_ASM, PRF_ASM_GOAL, PRF_SCRIPT, PRF_SCRIPT_GOAL,
60624
5b6552e12421 clarified keyword categories;
wenzelm
parents: 59701
diff changeset
    79
      PRF_SCRIPT_ASM_GOAL)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    80
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    81
  val theory_goal = Set(THY_GOAL)
60624
5b6552e12421 clarified keyword categories;
wenzelm
parents: 59701
diff changeset
    82
  val proof_goal = Set(PRF_GOAL, PRF_ASM_GOAL, PRF_SCRIPT_GOAL, PRF_SCRIPT_ASM_GOAL)
57835
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    83
  val qed = Set(QED, QED_SCRIPT, QED_BLOCK)
43ff8638c02c more keyword categories (as in ML);
wenzelm
parents: 56146
diff changeset
    84
  val qed_global = Set(QED_GLOBAL)
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    85
60692
wenzelm
parents: 60624
diff changeset
    86
  val proof_open = proof_goal + PRF_OPEN
wenzelm
parents: 60624
diff changeset
    87
  val proof_close = qed + PRF_CLOSE
63428
005b490f0ce2 indentation in reminiscence to Proof General (see proof-indent.el);
wenzelm
parents: 63424
diff changeset
    88
  val proof_enclose = Set(PRF_BLOCK, NEXT_BLOCK, QED_BLOCK, PRF_CLOSE)
60692
wenzelm
parents: 60624
diff changeset
    89
63603
9d9ea2c6bc38 clarified modules;
wenzelm
parents: 63579
diff changeset
    90
  val close_structure = Set(NEXT_BLOCK, QED_BLOCK, PRF_CLOSE, THY_END)
9d9ea2c6bc38 clarified modules;
wenzelm
parents: 63579
diff changeset
    91
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    92
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    93
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    94
  /** keyword tables **/
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
    95
65384
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
    96
  object Spec
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
    97
  {
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
    98
    val none: Spec = Spec("")
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
    99
  }
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   100
  sealed case class Spec(kind: String, exts: List[String] = Nil, tags: List[String] = Nil)
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   101
  {
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   102
    def is_none: Boolean = kind == ""
65385
23f36ab9042b print like syntax of Thy_Header.header;
wenzelm
parents: 65384
diff changeset
   103
23f36ab9042b print like syntax of Thy_Header.header;
wenzelm
parents: 65384
diff changeset
   104
    override def toString: String =
23f36ab9042b print like syntax of Thy_Header.header;
wenzelm
parents: 65384
diff changeset
   105
      kind +
23f36ab9042b print like syntax of Thy_Header.header;
wenzelm
parents: 65384
diff changeset
   106
        (if (exts.isEmpty) "" else " (" + commas_quote(exts) + ")") +
23f36ab9042b print like syntax of Thy_Header.header;
wenzelm
parents: 65384
diff changeset
   107
        (if (tags.isEmpty) "" else tags.map(quote).mkString(" % ", " % ", ""))
65384
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   108
  }
63429
baedd4724f08 tuned signature: more uniform Keyword.spec;
wenzelm
parents: 63428
diff changeset
   109
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   110
  object Keywords
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   111
  {
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   112
    def empty: Keywords = new Keywords()
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   113
  }
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   114
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   115
  class Keywords private(
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   116
    val minor: Scan.Lexicon = Scan.Lexicon.empty,
58901
47809a811eba clarified representation of type Keywords;
wenzelm
parents: 58900
diff changeset
   117
    val major: Scan.Lexicon = Scan.Lexicon.empty,
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   118
    val kinds: Map[String, String] = Map.empty,
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   119
    val load_commands: Map[String, List[String]] = Map.empty)
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   120
  {
58901
47809a811eba clarified representation of type Keywords;
wenzelm
parents: 58900
diff changeset
   121
    override def toString: String =
47809a811eba clarified representation of type Keywords;
wenzelm
parents: 58900
diff changeset
   122
    {
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   123
      val entries =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   124
        for ((name, kind) <- kinds.toList.sortBy(_._1)) yield {
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   125
          val exts = load_commands.getOrElse(name, Nil)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   126
          val kind_decl =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   127
            if (kind == "") ""
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   128
            else " :: " + quote(kind) + (if (exts.isEmpty) "" else " (" + commas_quote(exts) + ")")
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   129
          quote(name) + kind_decl
63430
9c5fcd355a2d support for quasi_command keywords;
wenzelm
parents: 63429
diff changeset
   130
        }
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   131
      entries.mkString("keywords\n  ", " and\n  ", "")
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   132
    }
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   133
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   134
59073
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   135
    /* merge */
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   136
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   137
    def is_empty: Boolean = minor.is_empty && major.is_empty
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   138
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   139
    def ++ (other: Keywords): Keywords =
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   140
      if (this eq other) this
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   141
      else if (is_empty) other
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   142
      else {
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   143
        val minor1 = minor ++ other.minor
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   144
        val major1 = major ++ other.major
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   145
        val kinds1 =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   146
          if (kinds eq other.kinds) kinds
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   147
          else if (kinds.isEmpty) other.kinds
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   148
          else (kinds /: other.kinds) { case (m, e) => if (m.isDefinedAt(e._1)) m else m + e }
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   149
        val load_commands1 =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   150
          if (load_commands eq other.load_commands) load_commands
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   151
          else if (load_commands.isEmpty) other.load_commands
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   152
          else
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   153
            (load_commands /: other.load_commands) {
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   154
              case (m, e) => if (m.isDefinedAt(e._1)) m else m + e }
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   155
        new Keywords(minor1, major1, kinds1, load_commands1)
59073
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   156
      }
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   157
dcecfcc56dce more merge operations;
wenzelm
parents: 58999
diff changeset
   158
58902
wenzelm
parents: 58901
diff changeset
   159
    /* add keywords */
wenzelm
parents: 58901
diff changeset
   160
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   161
    def + (name: String, kind: String = "", exts: List[String] = Nil): Keywords =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   162
    {
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   163
      val kinds1 = kinds + (name -> kind)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   164
      val (minor1, major1) =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   165
        if (kind == "" || kind == BEFORE_COMMAND || kind == QUASI_COMMAND)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   166
          (minor + name, major)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   167
        else (minor, major + name)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   168
      val load_commands1 =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   169
        if (kind == THY_LOAD) load_commands + (name -> exts)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   170
        else load_commands
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   171
      new Keywords(minor1, major1, kinds1, load_commands1)
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   172
    }
58902
wenzelm
parents: 58901
diff changeset
   173
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58907
diff changeset
   174
    def add_keywords(header: Thy_Header.Keywords): Keywords =
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58907
diff changeset
   175
      (this /: header) {
65384
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   176
        case (keywords, (name, spec)) =>
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   177
          if (spec.is_none)
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   178
            keywords + Symbol.decode(name) + Symbol.encode(name)
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   179
          else
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   180
            keywords +
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   181
              (Symbol.decode(name), spec.kind, spec.exts) +
36255c43c64c more explicit types;
wenzelm
parents: 63809
diff changeset
   182
              (Symbol.encode(name), spec.kind, spec.exts)
58928
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58907
diff changeset
   183
      }
23d0ffd48006 plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents: 58907
diff changeset
   184
58902
wenzelm
parents: 58901
diff changeset
   185
58901
47809a811eba clarified representation of type Keywords;
wenzelm
parents: 58900
diff changeset
   186
    /* command kind */
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   187
63424
e4e15bbfb3e2 clarified signature;
wenzelm
parents: 60694
diff changeset
   188
    def is_command(token: Token, check_kind: String => Boolean): Boolean =
e4e15bbfb3e2 clarified signature;
wenzelm
parents: 60694
diff changeset
   189
      token.is_command &&
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   190
        (kinds.get(token.source) match { case Some(k) => check_kind(k) case None => false })
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   191
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   192
    def is_before_command(token: Token): Boolean =
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   193
      token.is_keyword && kinds.get(token.source) == Some(BEFORE_COMMAND)
59701
8ab877c91992 more command categories, as in ML;
wenzelm
parents: 59700
diff changeset
   194
63430
9c5fcd355a2d support for quasi_command keywords;
wenzelm
parents: 63429
diff changeset
   195
    def is_quasi_command(token: Token): Boolean =
63441
4c3fa4dba79f explicit kind "before_command";
wenzelm
parents: 63430
diff changeset
   196
      token.is_keyword && kinds.get(token.source) == Some(QUASI_COMMAND)
63430
9c5fcd355a2d support for quasi_command keywords;
wenzelm
parents: 63429
diff changeset
   197
63809
wenzelm
parents: 63603
diff changeset
   198
    def is_indent_command(token: Token): Boolean =
wenzelm
parents: 63603
diff changeset
   199
      token.is_begin_or_command || is_quasi_command(token)
wenzelm
parents: 63603
diff changeset
   200
58900
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   201
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   202
    /* load commands */
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   203
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   204
    def load_commands_in(text: String): Boolean =
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   205
      load_commands.exists({ case (cmd, _) => text.containsSlice(cmd) })
1435cc20b022 explicit type Keyword.Keywords;
wenzelm
parents: 58868
diff changeset
   206
  }
29449
6e7745d35a30 added outer_keyword.scala: Isar command keyword classification;
wenzelm
parents:
diff changeset
   207
}