src/Pure/General/symbol.scala
author wenzelm
Sat, 16 Aug 2008 15:57:06 +0200
changeset 27918 85942d2036a0
parent 27905 070b4a6a9d58
child 27923 7ebe9d38743a
permissions -rw-r--r--
reading symbol interpretation tables;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/symbol.scala
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     4
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     5
Basic support for Isabelle symbols.
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     6
*/
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     7
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     8
package isabelle
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
     9
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    10
import java.util.regex.Pattern
27918
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    11
import java.io.File
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    12
import scala.io.Source
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    13
import scala.collection.mutable.HashMap
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    14
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    15
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    16
object Symbol {
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    17
27918
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    18
  /* Regexp utils */
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    19
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    20
  private def compile(s: String) =
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    21
    Pattern.compile(s, Pattern.COMMENTS | Pattern.DOTALL)
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    22
27918
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    23
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    24
  /* Symbol regexps */
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    25
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    26
  private val symbol_src = """ \\ \\? < (?:
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    27
      \^? [A-Za-z][A-Za-z0-9_']* |
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    28
      \^raw: [\x20-\x7e\u0100-\uffff && [^.>]]* ) >"""
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    29
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    30
  private val bad_symbol_src = "(?!" + symbol_src + ")" +
27918
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    31
    """ \\ \\? < (?: (?! \s | [\"`\\] | \(\* | \*\) | \{\* | \*\} ) . )*"""
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    32
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    33
  val symbol_pattern = compile(symbol_src)
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    34
  val bad_symbol_pattern = compile(bad_symbol_src)
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    35
  val pattern = compile(symbol_src + "|" + bad_symbol_src + "| .")
27918
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    36
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    37
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    38
  /* Symbol interpretation tables */
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    39
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    40
  private val empty_pattern = compile(""" ^\s* (?: \#.* )? $ """)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    41
  private val blank_pattern = compile(""" \s+ """)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    42
  private val key_pattern = compile(""" (.+): """)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    43
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    44
  class Interpretation extends HashMap[String, List[(String, String)]] {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    45
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    46
    class BadEntry(val line: String) extends Exception
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    47
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    48
    def read_line(line: String) = {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    49
      def err() = throw new BadEntry ("Bad symbol specification: " + line)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    50
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    51
      def read_pairs(props: List[String]): List[(String, String)] = {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    52
        props match {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    53
          case Nil => Nil
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    54
          case _ :: Nil => err()
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    55
          case key :: value :: rest => {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    56
            val key_matcher = key_pattern.matcher(key)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    57
            if (key_matcher.matches) { (key_matcher.group(1) -> value) :: read_pairs(rest) }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    58
            else err ()
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    59
          }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    60
        }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    61
      }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    62
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    63
      if (!empty_pattern.matcher(line).matches) {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    64
        blank_pattern.split(line).toList match {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    65
          case Nil => err()
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    66
          case symbol :: props => this + (symbol -> read_pairs(props))
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    67
        }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    68
      }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    69
    }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    70
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    71
    for (base <- List(IsabelleSystem.ISABELLE_HOME, IsabelleSystem.ISABELLE_HOME_USER)) {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    72
      val file = new File(base + File.separator + "etc" + File.separator + "symbols")
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    73
      if (file.canRead) {
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    74
        for (line <- Source.fromFile(file).getLines) read_line(line)
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    75
      }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    76
    }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    77
  }
85942d2036a0 reading symbol interpretation tables;
wenzelm
parents: 27905
diff changeset
    78
27901
28083e9f8d1d Basic support for Isabelle symbols.
wenzelm
parents:
diff changeset
    79
}