src/Pure/Thy/thy_structure.scala
author wenzelm
Tue, 12 Aug 2014 00:08:32 +0200
changeset 57905 c0c5652e796e
parent 57900 fd03765b06c0
child 57906 020df63dd0a9
permissions -rw-r--r--
separate module Command_Span: mostly syntactic representation; potentially prover-specific Output_Syntax.parse_spans;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57900
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/thy_structure.scala
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     3
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     4
Nested structure of theory source.
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     6
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     8
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
     9
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    10
import scala.collection.mutable
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    11
import scala.annotation.tailrec
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    12
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    13
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    14
object Thy_Structure
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    15
{
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    16
  sealed abstract class Entry { def length: Int }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    17
  case class Block(val name: String, val body: List[Entry]) extends Entry
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    18
  {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    19
    val length: Int = (0 /: body)(_ + _.length)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    20
  }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    21
  case class Atom(val command: Command) extends Entry
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    22
  {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    23
    def length: Int = command.length
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    24
  }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    25
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    26
  def parse(syntax: Outer_Syntax, node_name: Document.Node.Name, text: CharSequence): Entry =
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    27
  {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    28
    /* stack operations */
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    29
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    30
    def buffer(): mutable.ListBuffer[Entry] = new mutable.ListBuffer[Entry]
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    31
    var stack: List[(Int, String, mutable.ListBuffer[Entry])] =
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    32
      List((0, node_name.toString, buffer()))
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    33
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    34
    @tailrec def close(level: Int => Boolean)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    35
    {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    36
      stack match {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    37
        case (lev, name, body) :: (_, _, body2) :: rest if level(lev) =>
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    38
          body2 += Block(name, body.toList)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    39
          stack = stack.tail
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    40
          close(level)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    41
        case _ =>
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    42
      }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    43
    }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    44
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    45
    def result(): Entry =
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    46
    {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    47
      close(_ => true)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    48
      val (_, name, body) = stack.head
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    49
      Block(name, body.toList)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    50
    }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    51
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    52
    def add(command: Command)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    53
    {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    54
      syntax.heading_level(command) match {
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    55
        case Some(i) =>
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    56
          close(_ > i)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    57
          stack = (i + 1, command.source, buffer()) :: stack
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    58
        case None =>
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    59
      }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    60
      stack.head._3 += Atom(command)
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    61
    }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    62
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    63
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    64
    /* result structure */
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    65
57905
c0c5652e796e separate module Command_Span: mostly syntactic representation;
wenzelm
parents: 57900
diff changeset
    66
    val spans = syntax.parse_spans(syntax.scan(text))
57900
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    67
    spans.foreach(span => add(Command(Document_ID.none, node_name, Nil, span)))
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    68
    result()
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    69
  }
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    70
}
fd03765b06c0 clarified modules;
wenzelm
parents:
diff changeset
    71