ProgTutorial/chunks.ML
author Christian Urban <urbanc@in.tum.de>
Wed, 01 Apr 2009 12:26:56 +0100
changeset 219 98d43270024f
parent 189 069d525f8f1d
child 255 ef1da1abee46
permissions -rw-r--r--
more work on the simple inductive chapter
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
     1
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
     2
structure Chunks =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
     3
struct
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
     4
171
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
     5
(* rebuilding the output function from ThyOutput in order to *)
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
     6
(* enable the options [gray, linenos]                        *)
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
     7
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
     8
val gray = ref false;
117
796c6ea633b3 added an option for linenumbers to the chunk-antiquotation
Christian Urban <urbanc@in.tum.de>
parents: 96
diff changeset
     9
val linenos = ref false
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    10
171
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    11
fun output prts =
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    12
  prts
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    13
  |> (if ! ThyOutput.quotes then map Pretty.quote else I)
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    14
  |> (if ! ThyOutput.display then
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    15
    map (Output.output o Pretty.string_of o Pretty.indent (! ThyOutput.indent))
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    16
    #> space_implode "\\isasep\\isanewline%\n"
118
5f003fdf2653 polished and added more material to the package chapter
Christian Urban <urbanc@in.tum.de>
parents: 117
diff changeset
    17
    #> (if ! linenos then (enclose "\\begin{linenos}%\n" "%\n\\end{linenos}") else I) 
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    18
    #> (if ! gray then (enclose "\\begin{graybox}%\n" "%\n\\end{graybox}") else I) 
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    19
    #> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}"
171
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    20
  else
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    21
    map (Output.output o (if ! ThyOutput.break then Pretty.string_of else Pretty.str_of))
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    22
    #> space_implode "\\isasep\\isanewline%\n"
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    23
    #> enclose "\\isa{" "}");
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    24
171
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    25
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    26
fun boolean "" = true
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    27
  | boolean "true" = true
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    28
  | boolean "false" = false
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
    29
  | boolean s = error ("Bad boolean value: " ^ quote s);
96
018bfa718982 (re)defined the document antiquotation @subgoal in order to be closer to what is actually printed
Christian Urban <urbanc@in.tum.de>
parents: 90
diff changeset
    30
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    31
val _ = ThyOutput.add_options
117
796c6ea633b3 added an option for linenumbers to the chunk-antiquotation
Christian Urban <urbanc@in.tum.de>
parents: 96
diff changeset
    32
 [("gray", Library.setmp gray o boolean),
796c6ea633b3 added an option for linenumbers to the chunk-antiquotation
Christian Urban <urbanc@in.tum.de>
parents: 96
diff changeset
    33
  ("linenos", Library.setmp linenos o boolean)]
90
b071a0b88298 made chunks aware of the gray-option
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    34
96
018bfa718982 (re)defined the document antiquotation @subgoal in order to be closer to what is actually printed
Christian Urban <urbanc@in.tum.de>
parents: 90
diff changeset
    35
018bfa718982 (re)defined the document antiquotation @subgoal in order to be closer to what is actually printed
Christian Urban <urbanc@in.tum.de>
parents: 90
diff changeset
    36
018bfa718982 (re)defined the document antiquotation @subgoal in order to be closer to what is actually printed
Christian Urban <urbanc@in.tum.de>
parents: 90
diff changeset
    37
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    38
(** theory data **)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    39
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    40
structure ChunkData = TheoryDataFun
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    41
(
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    42
  type T = (ML_Lex.token list * stamp) NameSpace.table
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    43
  val empty = NameSpace.empty_table;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    44
  val copy = I;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    45
  val extend = I;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    46
  fun merge _ tables : T = NameSpace.merge_tables (eq_snd (op =)) tables handle Symtab.DUP dup =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    47
    error ("Attempt to merge different versions of ML chunk " ^ quote dup);
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    48
);
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    49
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    50
fun declare_chunk name thy =
55
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 24
diff changeset
    51
  (Sign.full_bname thy name,
176
3da5f3f07d8b updated to new read_specification
Christian Urban <urbanc@in.tum.de>
parents: 171
diff changeset
    52
   ChunkData.map (snd o NameSpace.define (Sign.naming_of thy)
55
0b55402ae95e Adapted to changes in binding module.
berghofe
parents: 24
diff changeset
    53
     (Binding.name name, ([], stamp ()))) thy
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    54
   handle Symtab.DUP _ => error ("Duplicate definition of ML chunk " ^ quote name));
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    55
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    56
fun augment_chunk tok name =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    57
  ChunkData.map (apsnd (Symtab.map_entry name (apfst (cons tok))));
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    58
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    59
fun the_chunk thy name =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    60
  let val (space, tab) = ChunkData.get thy
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    61
  in case Symtab.lookup tab (NameSpace.intern space name) of
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    62
      NONE => error ("Unknown ML chunk " ^ quote name)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    63
    | SOME (toks, _) => rev toks
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    64
  end;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    65
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    66
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    67
(** parsers **)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    68
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    69
val not_eof = ML_Lex.stopper |> Scan.is_stopper #> not;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    70
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    71
val scan_space = Scan.many Symbol.is_blank;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    72
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    73
fun scan_cmt scan =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    74
  Scan.one (ML_Lex.kind_of #> equal ML_Lex.Comment) >>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    75
  (ML_Lex.content_of #> Symbol.explode #> Scan.finite Symbol.stopper scan #> fst);
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    76
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    77
val scan_chunks = Scan.depend (fn (open_chunks, thy) =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    78
  scan_cmt ((Scan.this_string "(*" -- scan_space -- Scan.this_string "@chunk" --
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    79
    scan_space) |-- Symbol.scan_id --|
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    80
    (scan_space -- Scan.this_string "*)") >> (fn name =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    81
      let val (name', thy') = declare_chunk name thy
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    82
      in ((name' :: open_chunks, thy'), "") end))
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    83
  ||
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    84
  scan_cmt (Scan.this_string "(*" -- scan_space -- Scan.this_string "@end" --
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    85
    scan_space -- Scan.this_string "*)" >> (fn _ =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    86
      (case open_chunks of
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    87
         [] => error "end without matching chunk encountered"
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    88
       | _ :: open_chunks' => ((open_chunks', thy), ""))))
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    89
  ||
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    90
  Scan.one not_eof >> (fn tok =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    91
    ((open_chunks, fold (augment_chunk tok) open_chunks thy), ML_Lex.content_of tok)));
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    92
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    93
fun chunks_of s thy =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    94
  let val toks = Source.exhaust (ML_Lex.source (Source.of_string s))
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    95
  in case Scan.finite' ML_Lex.stopper (Scan.repeat (Scan.error scan_chunks))
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    96
        (([], thy), toks) of
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    97
      (toks', (([], thy'), _)) => (implode toks', thy')
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    98
    | (_, ((open_chunks, _), _)) =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
    99
        error ("Open chunks at end of text: " ^ commas_quote open_chunks)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   100
  end;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   101
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   102
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   103
(** use command **)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   104
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   105
fun load_ml dir raw_path thy =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   106
  (case ThyLoad.check_ml dir raw_path of
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   107
    NONE => error ("Could not find ML file " ^ quote (Path.implode raw_path))
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   108
  | SOME (path, _) =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   109
      let val (s, thy') = chunks_of (File.read path) thy
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   110
      in
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   111
        Context.theory_map (ThyInfo.exec_file false raw_path) thy'
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   112
      end);
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   113
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   114
fun use_chunks path thy =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   115
  load_ml (ThyInfo.master_directory (Context.theory_name thy)) path thy;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   116
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   117
val _ =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   118
  OuterSyntax.command "use_chunks" "eval ML text from file"
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   119
    (OuterKeyword.tag_ml OuterKeyword.thy_decl)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   120
    (OuterParse.path >> (Toplevel.theory o use_chunks));
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   121
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   122
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   123
(** antiquotation **)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   124
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   125
val str_of_source = space_implode " " o map OuterLex.unparse o #2 o #1 o Args.dest_src;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   126
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   127
val verbatim = space_implode "\\verb,|," o map (enclose "\\verb|" "|") o space_explode "|";
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   128
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   129
val transform_cmts =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   130
  Scan.finite ML_Lex.stopper (Scan.repeat
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   131
    (   scan_cmt
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   132
          (Scan.this_string "(*{" |--
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   133
           Scan.repeat (Scan.unless (Scan.this_string "}*)")
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   134
             (Scan.one (not o Symbol.is_eof))) --|
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   135
           Scan.this_string "}*)" >>
57
065f472c09ab Repaired output of marginal comments in ML antiquotation.
berghofe
parents: 55
diff changeset
   136
           (Symbol.encode_raw o enclose "\\hfill\\textrm{\\textit{" "}}" o implode))
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   137
     || Scan.one not_eof >> ML_Lex.content_of)) #>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   138
  fst;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   139
165
890fbfef6d6b partially adapted to new antiquotation infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   140
fun output_chunk {state: Toplevel.state, source = src, context = ctxt} name =
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   141
  let
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   142
    val toks = the_chunk (ProofContext.theory_of ctxt) name;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   143
    val (spc, toks') = (case toks of
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   144
        [] => ("", [])
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   145
      | [tok] => ("", [tok])
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   146
      | tok :: toks' =>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   147
          let
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   148
            val (toks'', tok') = split_last toks'
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   149
            val toks''' =
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   150
              if ML_Lex.kind_of tok' = ML_Lex.Space then toks''
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   151
              else toks'
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   152
          in
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   153
            if ML_Lex.kind_of tok = ML_Lex.Space then
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   154
              (tok |> ML_Lex.content_of |> Symbol.explode |>
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   155
               take_suffix (equal " ") |> snd |> implode,
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   156
               toks''')
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   157
            else ("", tok :: toks''')
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   158
          end)
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   159
    val txt = spc ^ implode (transform_cmts toks')
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   160
  in
57
065f472c09ab Repaired output of marginal comments in ML antiquotation.
berghofe
parents: 55
diff changeset
   161
    txt |> split_lines |>
171
18f90044c777 simplified antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 165
diff changeset
   162
    (map Pretty.str) |> output 
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   163
  end;
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   164
165
890fbfef6d6b partially adapted to new antiquotation infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 118
diff changeset
   165
val _ = ThyOutput.antiquotation "ML_chunk" (Scan.lift Args.name) output_chunk;
24
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   166
9d5d2f9d7c09 Antiquotation for referring to chunks of ML code.
berghofe
parents:
diff changeset
   167
end;