author | wenzelm |
Wed, 10 Nov 2010 15:43:06 +0100 | |
changeset 40715 | 12c8c64203b3 |
parent 40712 | e035dad8eca2 |
child 40716 | 913e545d9a9b |
permissions | -rw-r--r-- |
wenzelm@34173 | 1 |
/* Title: Pure/Isar/outer_syntax.scala |
wenzelm@34173 | 2 |
Author: Makarius |
wenzelm@34173 | 3 |
|
wenzelm@34173 | 4 |
Isabelle/Isar outer syntax. |
wenzelm@34173 | 5 |
*/ |
wenzelm@34173 | 6 |
|
wenzelm@34173 | 7 |
package isabelle |
wenzelm@34173 | 8 |
|
wenzelm@34173 | 9 |
|
wenzelm@34173 | 10 |
import scala.util.parsing.input.{Reader, CharSequenceReader} |
wenzelm@34173 | 11 |
|
wenzelm@34173 | 12 |
|
wenzelm@34173 | 13 |
class Outer_Syntax(symbols: Symbol.Interpretation) |
wenzelm@34173 | 14 |
{ |
wenzelm@36947 | 15 |
protected val keywords: Map[String, String] = Map((";" -> Keyword.DIAG)) |
wenzelm@34173 | 16 |
protected val lexicon: Scan.Lexicon = Scan.Lexicon.empty |
wenzelm@34173 | 17 |
lazy val completion: Completion = new Completion + symbols // FIXME !? |
wenzelm@34173 | 18 |
|
wenzelm@38789 | 19 |
def keyword_kind(name: String): Option[String] = keywords.get(name) |
wenzelm@38789 | 20 |
|
wenzelm@34173 | 21 |
def + (name: String, kind: String): Outer_Syntax = |
wenzelm@34173 | 22 |
{ |
wenzelm@34173 | 23 |
val new_keywords = keywords + (name -> kind) |
wenzelm@34173 | 24 |
val new_lexicon = lexicon + name |
wenzelm@34173 | 25 |
val new_completion = completion + name |
wenzelm@34173 | 26 |
new Outer_Syntax(symbols) { |
wenzelm@34173 | 27 |
override val lexicon = new_lexicon |
wenzelm@34173 | 28 |
override val keywords = new_keywords |
wenzelm@34173 | 29 |
override lazy val completion = new_completion |
wenzelm@34173 | 30 |
} |
wenzelm@34173 | 31 |
} |
wenzelm@34173 | 32 |
|
wenzelm@36947 | 33 |
def + (name: String): Outer_Syntax = this + (name, Keyword.MINOR) |
wenzelm@34173 | 34 |
|
wenzelm@34173 | 35 |
def is_command(name: String): Boolean = |
wenzelm@40715 | 36 |
keyword_kind(name) match { |
wenzelm@36947 | 37 |
case Some(kind) => kind != Keyword.MINOR |
wenzelm@34173 | 38 |
case None => false |
wenzelm@34173 | 39 |
} |
wenzelm@34173 | 40 |
|
wenzelm@40712 | 41 |
def is_heading(name: String): Boolean = |
wenzelm@40715 | 42 |
keyword_kind(name) match { |
wenzelm@40712 | 43 |
case Some(kind) => Keyword.heading(kind) |
wenzelm@40712 | 44 |
case None => false |
wenzelm@40712 | 45 |
} |
wenzelm@40712 | 46 |
|
wenzelm@40711 | 47 |
def heading_level(name: String): Option[Int] = |
wenzelm@40711 | 48 |
name match { |
wenzelm@40715 | 49 |
// FIXME avoid hard-wired info!? |
wenzelm@40711 | 50 |
case "header" => Some(1) |
wenzelm@40711 | 51 |
case "chapter" => Some(2) |
wenzelm@40711 | 52 |
case "section" | "sect" => Some(3) |
wenzelm@40711 | 53 |
case "subsection" | "subsect" => Some(4) |
wenzelm@40711 | 54 |
case "subsubsection" | "subsubsect" => Some(5) |
wenzelm@40715 | 55 |
case _ => |
wenzelm@40715 | 56 |
keyword_kind(name) match { |
wenzelm@40715 | 57 |
case Some(kind) if Keyword.theory(kind) => Some(6) |
wenzelm@40715 | 58 |
case _ => None |
wenzelm@40715 | 59 |
} |
wenzelm@40711 | 60 |
} |
wenzelm@40711 | 61 |
|
wenzelm@40711 | 62 |
def heading_level(command: Command): Option[Int] = |
wenzelm@40711 | 63 |
heading_level(command.name) |
wenzelm@40711 | 64 |
|
wenzelm@34173 | 65 |
|
wenzelm@34173 | 66 |
/* tokenize */ |
wenzelm@34173 | 67 |
|
wenzelm@36966 | 68 |
def scan(input: Reader[Char]): List[Token] = |
wenzelm@34173 | 69 |
{ |
wenzelm@34173 | 70 |
import lexicon._ |
wenzelm@34173 | 71 |
|
wenzelm@34173 | 72 |
parseAll(rep(token(symbols, is_command)), input) match { |
wenzelm@34173 | 73 |
case Success(tokens, _) => tokens |
wenzelm@34269 | 74 |
case _ => error("Unexpected failure of tokenizing input:\n" + input.source.toString) |
wenzelm@34173 | 75 |
} |
wenzelm@34173 | 76 |
} |
wenzelm@34173 | 77 |
|
wenzelm@36966 | 78 |
def scan(input: CharSequence): List[Token] = |
wenzelm@34173 | 79 |
scan(new CharSequenceReader(input)) |
wenzelm@34173 | 80 |
} |