src/Pure/General/comment.scala
author wenzelm
Wed, 20 Mar 2019 23:06:51 +0100
changeset 69933 c15ee153dec1
parent 69891 def3ec9cdb7e
child 75393 87ebf5a50283
permissions -rw-r--r--
updated to cygwin-20190320;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67438
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/comment.scala
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     3
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     4
Formal comments.
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     5
*/
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     6
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     8
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
     9
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    10
object Comment
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    11
{
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    12
  object Kind extends Enumeration
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    13
  {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    14
    val COMMENT = Value("formal comment")
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    15
    val CANCEL = Value("canceled text")
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    16
    val LATEX = Value("embedded LaTeX")
69891
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 67449
diff changeset
    17
    val MARKER = Value("document marker")
67438
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    18
  }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    19
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    20
  lazy val symbols: Set[Symbol.Symbol] =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    21
    Set(Symbol.comment, Symbol.comment_decoded,
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    22
      Symbol.cancel, Symbol.cancel_decoded,
69891
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 67449
diff changeset
    23
      Symbol.latex, Symbol.latex_decoded,
def3ec9cdb7e document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents: 67449
diff changeset
    24
      Symbol.marker, Symbol.marker_decoded)
67438
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    25
67449
1caeb087d957 tuned signature;
wenzelm
parents: 67438
diff changeset
    26
  lazy val symbols_blanks: Set[Symbol.Symbol] =
1caeb087d957 tuned signature;
wenzelm
parents: 67438
diff changeset
    27
    Set(Symbol.comment, Symbol.comment_decoded)
67438
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    28
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    29
  def content(source: String): String =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    30
  {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    31
    def err(): Nothing = error("Malformed formal comment: " + quote(source))
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    32
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    33
    Symbol.explode(source) match {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    34
      case sym :: rest if symbols_blanks(sym) =>
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    35
        val body = if (symbols_blanks(sym)) rest.dropWhile(Symbol.is_blank) else rest
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    36
        try { Scan.Parsers.cartouche_content(body.mkString) }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    37
        catch { case ERROR(_) => err() }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    38
      case _ => err()
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    39
    }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    40
  }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    41
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    42
  trait Parsers extends Scan.Parsers
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    43
  {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    44
   def comment_prefix: Parser[String] =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    45
     one(symbols_blanks) ~ many(Symbol.is_blank) ^^ { case a ~ b => a + b.mkString } |
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    46
     one(symbols)
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    47
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    48
   def comment_cartouche: Parser[String] =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    49
      comment_prefix ~ cartouche ^^ { case a ~ b => a + b }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    50
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    51
    def comment_cartouche_line(ctxt: Scan.Line_Context): Parser[(String, Scan.Line_Context)] =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    52
    {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    53
      def cartouche_context(d: Int): Scan.Line_Context =
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    54
        if (d == 0) Scan.Finished else Scan.Cartouche_Comment(d)
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    55
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    56
      ctxt match {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    57
        case Scan.Finished =>
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    58
          comment_prefix ~ opt(cartouche_depth(0)) ^^ {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    59
            case a ~ None => (a, Scan.Comment_Prefix(a))
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    60
            case a ~ Some((c, d)) => (a + c, cartouche_context(d)) }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    61
        case Scan.Comment_Prefix(a) if symbols_blanks(a) =>
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    62
          many1(Symbol.is_blank) ~ opt(cartouche_depth(0)) ^^ {
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    63
            case b ~ None => (b.mkString, Scan.Comment_Prefix(a))
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    64
            case b ~ Some((c, d)) => (b.mkString + c, cartouche_context(d)) } |
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    65
          cartouche_depth(0) ^^ { case (c, d) => (c, cartouche_context(d)) }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    66
        case Scan.Comment_Prefix(_) =>
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    67
          cartouche_depth(0) ^^ { case (c, d) => (c, cartouche_context(d)) }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    68
        case Scan.Cartouche_Comment(depth) =>
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    69
          cartouche_depth(depth) ^^ { case (c, d) => (c, cartouche_context(d)) }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    70
        case _ => failure("")
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    71
      }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    72
    }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    73
  }
fdb7b995974d clarified modules;
wenzelm
parents:
diff changeset
    74
}