src/Pure/General/comment.ML
author wenzelm
Sat, 03 Feb 2018 20:34:26 +0100
changeset 67571 f858fe5531ac
parent 67506 30233285270a
child 67572 a93cf1d6ba87
permissions -rw-r--r--
more uniform treatment of formal comments within document source; more robust nesting;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/comment.ML
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     3
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     4
Formal comments.
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     5
*)
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     6
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     7
signature COMMENT =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
     8
sig
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
     9
  datatype kind = Comment | Cancel | Latex
67506
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    10
  val markups: kind -> Markup.T list
67571
f858fe5531ac more uniform treatment of formal comments within document source;
wenzelm
parents: 67506
diff changeset
    11
  val is_symbol: Symbol.symbol -> bool
67426
6311cf9dc943 clarified signature;
wenzelm
parents: 67425
diff changeset
    12
  val scan_comment: (kind * Symbol_Pos.T list) scanner
6311cf9dc943 clarified signature;
wenzelm
parents: 67425
diff changeset
    13
  val scan_cancel: (kind * Symbol_Pos.T list) scanner
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    14
  val scan_latex: (kind * Symbol_Pos.T list) scanner
67426
6311cf9dc943 clarified signature;
wenzelm
parents: 67425
diff changeset
    15
  val scan: (kind * Symbol_Pos.T list) scanner
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    16
  val read_body: Symbol_Pos.T list -> (kind option * Symbol_Pos.T list) list option
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    17
end;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    18
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    19
structure Comment: COMMENT =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    20
struct
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    21
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    22
(* kinds *)
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    23
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    24
datatype kind = Comment | Cancel | Latex;
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    25
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    26
val kinds =
67506
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    27
  [(Comment,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    28
     {symbol = Symbol.comment, blanks = true,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    29
      markups = [Markup.language_document true]}),
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    30
   (Cancel,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    31
     {symbol = Symbol.cancel, blanks = false,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    32
      markups = [Markup.language_text true]}),
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    33
   (Latex,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    34
     {symbol = Symbol.latex, blanks = false,
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    35
      markups = [Markup.language_latex true, Markup.no_words]})];
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    36
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    37
val get_kind = the o AList.lookup (op =) kinds;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    38
val print_kind = quote o #symbol o get_kind;
67506
30233285270a more markup: disable spell-checker for raw latex;
wenzelm
parents: 67429
diff changeset
    39
val markups = #markups o get_kind;
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    40
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    41
fun is_symbol sym = exists (fn (_, {symbol, ...}) => symbol = sym) kinds;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    42
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    43
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    44
(* scan *)
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    45
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    46
local
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    47
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    48
open Basic_Symbol_Pos;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    49
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    50
val err_prefix = "Error in formal comment: ";
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    51
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    52
val scan_blanks = Scan.many (Symbol.is_blank o Symbol_Pos.symbol);
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    53
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    54
fun scan_symbol kind =
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    55
  let val {blanks, symbol, ...} = get_kind kind
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    56
  in if blanks then $$$ symbol @@@ scan_blanks else $$$ symbol end;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    57
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    58
fun scan_strict kind =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    59
  scan_symbol kind @@@
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    60
    Symbol_Pos.!!! (fn () => err_prefix ^ "cartouche expected after " ^ print_kind kind)
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    61
      (Symbol_Pos.scan_cartouche err_prefix) >> pair kind;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    62
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    63
fun scan_permissive kind =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    64
  scan_symbol kind -- Scan.option (Symbol_Pos.scan_cartouche err_prefix) >>
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    65
    (fn (ss, NONE) => (NONE, ss) | (_, SOME ss) => (SOME kind, ss));
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    66
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    67
in
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    68
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    69
val scan_comment = scan_strict Comment;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    70
val scan_cancel = scan_strict Cancel;
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    71
val scan_latex = scan_strict Latex;
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    72
val scan = scan_comment || scan_cancel || scan_latex;
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    73
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    74
val scan_body =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    75
  Scan.many1 (fn (s, _) => not (is_symbol s) andalso Symbol.not_eof s) >> pair NONE ||
67429
95877cc6630e allow LaTeX source as formal comment;
wenzelm
parents: 67426
diff changeset
    76
  scan_permissive Comment || scan_permissive Cancel || scan_permissive Latex;
67425
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    77
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    78
fun read_body syms =
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    79
  if exists (is_symbol o Symbol_Pos.symbol) syms then
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    80
    Scan.read Symbol_Pos.stopper (Scan.repeat scan_body) syms
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    81
  else NONE;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    82
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    83
end;
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    84
7d4a088dbc0e clarified modules: uniform notion of formal comments;
wenzelm
parents:
diff changeset
    85
end;