src/Pure/Tools/isabelle_syntax.scala
author wenzelm
Sun, 18 Jan 2009 20:05:01 +0100
changeset 29552 5b21c79785b0
parent 29140 e7ac5bb20aed
child 29571 ba0cf984e593
permissions -rw-r--r--
added append_list, encode_list; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/isabelle_syntax.scala
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     3
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     4
Isabelle outer syntax.
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     5
*/
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     6
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     7
package isabelle
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     8
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
     9
import java.util.{Properties, Enumeration}
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    10
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    11
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    12
object IsabelleSyntax {
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    13
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    14
  /* string token */
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    15
29552
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    16
  def append_string(str: String, result: StringBuilder)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    17
  {
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    18
    result.append("\"")
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    19
    for (c <- str) {
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    20
      if (c < 32 || c == '\\' || c == '\"') {
27954
4558d93e83b7 append_string: proper backslash in character escapes;
wenzelm
parents: 27951
diff changeset
    21
        result.append("\\")
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    22
        if (c < 10) result.append('0')
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    23
        if (c < 100) result.append('0')
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    24
        result.append(c.asInstanceOf[Int].toString)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    25
      }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    26
      else result.append(c)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    27
    }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    28
    result.append("\"")
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    29
  }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    30
29552
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    31
  def encode_string(str: String) =
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    32
  {
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    33
    val result = new StringBuilder(str.length + 20)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    34
    append_string(str, result)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    35
    result.toString
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    36
  }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    37
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    38
29552
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    39
  /* list */
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    40
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    41
  def append_list[A](append_elem: (A, StringBuilder) => Unit, body: Iterable[A],
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    42
    result: StringBuilder)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    43
  {
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    44
    result.append("(")
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    45
    val elems = body.elements
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    46
    if (elems.hasNext) append_elem(elems.next, result)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    47
    while (elems.hasNext) {
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    48
      result.append(", ")
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    49
      append_elem(elems.next, result)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    50
    }
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    51
    result.append(")")
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    52
  }
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    53
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    54
  def encode_list[A](append_elem: (A, StringBuilder) => Unit, elems: Iterable[A]) =
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    55
  {
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    56
    val result = new StringBuilder(20)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    57
    append_list(append_elem, elems, result)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    58
    result.toString
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    59
  }
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    60
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    61
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    62
  /* properties */
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    63
29552
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    64
  def append_properties(props: Properties, result: StringBuilder)
5b21c79785b0 added append_list, encode_list;
wenzelm
parents: 29140
diff changeset
    65
  {
27951
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    66
    result.append("(")
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    67
    val names = props.propertyNames.asInstanceOf[Enumeration[String]]
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    68
    while (names.hasMoreElements) {
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    69
      val name = names.nextElement; val value = props.getProperty(name)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    70
      append_string(name, result); result.append(" = "); append_string(value, result)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    71
      if (names.hasMoreElements) result.append(", ")
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    72
    }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    73
    result.append(")")
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    74
  }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    75
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    76
  def encode_properties(props: Properties) = {
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    77
    val result = new StringBuilder(40)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    78
    append_properties(props, result)
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    79
    result.toString
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    80
  }
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    81
8adddc0b591f Isabelle outer syntax.
wenzelm
parents:
diff changeset
    82
}