| author | blanchet | 
| Thu, 02 Oct 2014 12:02:28 +0200 | |
| changeset 58508 | cb68c3f564fe | 
| parent 58503 | ea22f2380871 | 
| child 58694 | 983e98da2a42 | 
| permissions | -rw-r--r-- | 
| 34166 | 1  | 
/* Title: Pure/Isar/outer_syntax.scala  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Isabelle/Isar outer syntax.  | 
|
5  | 
*/  | 
|
6  | 
||
7  | 
package isabelle  | 
|
8  | 
||
9  | 
||
10  | 
import scala.util.parsing.input.{Reader, CharSequenceReader}
 | 
|
| 
43411
 
0206466ee473
some support for partial scans with explicit context;
 
wenzelm 
parents: 
40533 
diff
changeset
 | 
11  | 
import scala.collection.mutable  | 
| 34166 | 12  | 
|
13  | 
||
| 
43774
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
14  | 
object Outer_Syntax  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
15  | 
{
 | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
16  | 
def quote_string(str: String): String =  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
17  | 
  {
 | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
18  | 
val result = new StringBuilder(str.length + 10)  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
19  | 
result += '"'  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
20  | 
    for (s <- Symbol.iterator(str)) {
 | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
21  | 
      if (s.length == 1) {
 | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
22  | 
val c = s(0)  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
23  | 
        if (c < 32 && c != YXML.X && c != YXML.Y || c == '\\' || c == '"') {
 | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
24  | 
result += '\\'  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
25  | 
if (c < 10) result += '0'  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
26  | 
if (c < 100) result += '0'  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
27  | 
result ++= (c.asInstanceOf[Int].toString)  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
28  | 
}  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
29  | 
else result += c  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
30  | 
}  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
31  | 
else result ++= s  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
32  | 
}  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
33  | 
result += '"'  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
34  | 
result.toString  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
35  | 
}  | 
| 46626 | 36  | 
|
| 46941 | 37  | 
val empty: Outer_Syntax = new Outer_Syntax()  | 
| 
48870
 
4accee106f0f
clarified initialization of Thy_Load, Thy_Info, Session;
 
wenzelm 
parents: 
48864 
diff
changeset
 | 
38  | 
|
| 46941 | 39  | 
def init(): Outer_Syntax = new Outer_Syntax(completion = Completion.init())  | 
| 
43774
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
40  | 
}  | 
| 
 
6dfdb70496fe
added Outer_Syntax.quote_string, which is conceptually a bit different from Token.unparse;
 
wenzelm 
parents: 
43695 
diff
changeset
 | 
41  | 
|
| 46712 | 42  | 
final class Outer_Syntax private(  | 
| 
48864
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
43  | 
keywords: Map[String, (String, List[String])] = Map.empty,  | 
| 46626 | 44  | 
lexicon: Scan.Lexicon = Scan.Lexicon.empty,  | 
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
45  | 
val completion: Completion = Completion.empty,  | 
| 55749 | 46  | 
val language_context: Completion.Language_Context = Completion.Language_Context.outer,  | 
| 
56393
 
22f533e6a049
more abstract Prover.Syntax, as proposed by Carst Tankink;
 
wenzelm 
parents: 
56314 
diff
changeset
 | 
47  | 
val has_tokens: Boolean = true) extends Prover.Syntax  | 
| 34166 | 48  | 
{
 | 
| 
48660
 
730ca503e955
static outer syntax based on session specifications;
 
wenzelm 
parents: 
47469 
diff
changeset
 | 
49  | 
override def toString: String =  | 
| 
48864
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
50  | 
    (for ((name, (kind, files)) <- keywords) yield {
 | 
| 
48660
 
730ca503e955
static outer syntax based on session specifications;
 
wenzelm 
parents: 
47469 
diff
changeset
 | 
51  | 
if (kind == Keyword.MINOR) quote(name)  | 
| 
48864
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
52  | 
else  | 
| 
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
53  | 
quote(name) + " :: " + quote(kind) +  | 
| 
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
54  | 
        (if (files.isEmpty) "" else " (" + commas_quote(files) + ")")
 | 
| 48671 | 55  | 
    }).toList.sorted.mkString("keywords\n  ", " and\n  ", "")
 | 
| 
48660
 
730ca503e955
static outer syntax based on session specifications;
 
wenzelm 
parents: 
47469 
diff
changeset
 | 
56  | 
|
| 
48864
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
57  | 
def keyword_kind_files(name: String): Option[(String, List[String])] = keywords.get(name)  | 
| 
 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 
wenzelm 
parents: 
48708 
diff
changeset
 | 
58  | 
def keyword_kind(name: String): Option[String] = keyword_kind_files(name).map(_._1)  | 
| 
38471
 
0924654b8163
report command token name instead of kind, which can be retrieved later via Outer_Syntax.keyword_kind;
 
wenzelm 
parents: 
36956 
diff
changeset
 | 
59  | 
|
| 
57901
 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 
wenzelm 
parents: 
56393 
diff
changeset
 | 
60  | 
def load_command(name: String): Option[List[String]] =  | 
| 
 
e1abca2527da
more explicit type Span in Scala, according to ML version;
 
wenzelm 
parents: 
56393 
diff
changeset
 | 
61  | 
    keywords.get(name) match {
 | 
| 54513 | 62  | 
case Some((Keyword.THY_LOAD, exts)) => Some(exts)  | 
| 54462 | 63  | 
case _ => None  | 
64  | 
}  | 
|
65  | 
||
| 56314 | 66  | 
val load_commands: List[(String, List[String])] =  | 
| 48885 | 67  | 
(for ((name, (Keyword.THY_LOAD, files)) <- keywords.iterator) yield (name, files)).toList  | 
| 48872 | 68  | 
|
| 
56393
 
22f533e6a049
more abstract Prover.Syntax, as proposed by Carst Tankink;
 
wenzelm 
parents: 
56314 
diff
changeset
 | 
69  | 
def load_commands_in(text: String): Boolean =  | 
| 
 
22f533e6a049
more abstract Prover.Syntax, as proposed by Carst Tankink;
 
wenzelm 
parents: 
56314 
diff
changeset
 | 
70  | 
    load_commands.exists({ case (cmd, _) => text.containsSlice(cmd) })
 | 
| 
 
22f533e6a049
more abstract Prover.Syntax, as proposed by Carst Tankink;
 
wenzelm 
parents: 
56314 
diff
changeset
 | 
71  | 
|
| 
50128
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
72  | 
def + (name: String, kind: (String, List[String]), replace: Option[String]): Outer_Syntax =  | 
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
73  | 
  {
 | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
74  | 
val keywords1 = keywords + (name -> kind)  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
75  | 
val lexicon1 = lexicon + name  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
76  | 
val completion1 =  | 
| 
50128
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
77  | 
      if (Keyword.control(kind._1) || replace == Some("")) completion
 | 
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
78  | 
else completion + (name, replace getOrElse name)  | 
| 55749 | 79  | 
new Outer_Syntax(keywords1, lexicon1, completion1, language_context, true)  | 
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
80  | 
}  | 
| 34166 | 81  | 
|
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
82  | 
def + (name: String, kind: (String, List[String])): Outer_Syntax =  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
83  | 
this + (name, kind, Some(name))  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
84  | 
def + (name: String, kind: String): Outer_Syntax =  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
85  | 
this + (name, (kind, Nil), Some(name))  | 
| 
50128
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
86  | 
def + (name: String, replace: Option[String]): Outer_Syntax =  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
87  | 
this + (name, (Keyword.MINOR, Nil), replace)  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
88  | 
def + (name: String): Outer_Syntax = this + (name, None)  | 
| 48706 | 89  | 
|
| 48873 | 90  | 
def add_keywords(keywords: Thy_Header.Keywords): Outer_Syntax =  | 
91  | 
    (this /: keywords) {
 | 
|
| 
52439
 
4cf3f6153eb8
improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
 
wenzelm 
parents: 
52066 
diff
changeset
 | 
92  | 
case (syntax, (name, Some((kind, _)), replace)) =>  | 
| 
50128
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
93  | 
syntax +  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
94  | 
(Symbol.decode(name), kind, replace) +  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
95  | 
(Symbol.encode(name), kind, replace)  | 
| 
52439
 
4cf3f6153eb8
improved "isabelle keywords" and "isabelle update_keywords" based on Isabelle/Scala, without requiring to build sessions first;
 
wenzelm 
parents: 
52066 
diff
changeset
 | 
96  | 
case (syntax, (name, None, replace)) =>  | 
| 
50128
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
97  | 
syntax +  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
98  | 
(Symbol.decode(name), replace) +  | 
| 
 
599c935aac82
alternative completion for outer syntax keywords;
 
wenzelm 
parents: 
48885 
diff
changeset
 | 
99  | 
(Symbol.encode(name), replace)  | 
| 46940 | 100  | 
}  | 
| 34166 | 101  | 
|
102  | 
def is_command(name: String): Boolean =  | 
|
| 
40458
 
12c8c64203b3
treat main theory commands like headings, and nest anything else inside;
 
wenzelm 
parents: 
40455 
diff
changeset
 | 
103  | 
    keyword_kind(name) match {
 | 
| 36947 | 104  | 
case Some(kind) => kind != Keyword.MINOR  | 
| 34166 | 105  | 
case None => false  | 
106  | 
}  | 
|
107  | 
||
| 
40454
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
108  | 
def heading_level(name: String): Option[Int] =  | 
| 46969 | 109  | 
  {
 | 
110  | 
    keyword_kind(name) match {
 | 
|
111  | 
case _ if name == "header" => Some(0)  | 
|
112  | 
case Some(Keyword.THY_HEADING1) => Some(1)  | 
|
113  | 
case Some(Keyword.THY_HEADING2) | Some(Keyword.PRF_HEADING2) => Some(2)  | 
|
114  | 
case Some(Keyword.THY_HEADING3) | Some(Keyword.PRF_HEADING3) => Some(3)  | 
|
115  | 
case Some(Keyword.THY_HEADING4) | Some(Keyword.PRF_HEADING4) => Some(4)  | 
|
116  | 
case Some(kind) if Keyword.theory(kind) => Some(5)  | 
|
117  | 
case _ => None  | 
|
| 
40454
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
118  | 
}  | 
| 46969 | 119  | 
}  | 
| 
40454
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
120  | 
|
| 
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
121  | 
def heading_level(command: Command): Option[Int] =  | 
| 
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
122  | 
heading_level(command.name)  | 
| 
 
2516ea25a54b
some support for nested source structure, based on section headings;
 
wenzelm 
parents: 
38471 
diff
changeset
 | 
123  | 
|
| 34166 | 124  | 
|
| 
53280
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
125  | 
/* token language */  | 
| 
 
c63a016805b9
explicit indication of outer syntax with no tokens;
 
wenzelm 
parents: 
52439 
diff
changeset
 | 
126  | 
|
| 57907 | 127  | 
def scan(input: CharSequence): List[Token] =  | 
| 
52066
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
128  | 
  {
 | 
| 58503 | 129  | 
val in: Reader[Char] = new CharSequenceReader(input)  | 
| 55616 | 130  | 
Token.Parsers.parseAll(  | 
| 57907 | 131  | 
        Token.Parsers.rep(Token.Parsers.token(lexicon, is_command)), in) match {
 | 
| 55494 | 132  | 
case Token.Parsers.Success(tokens, _) => tokens  | 
| 57907 | 133  | 
      case _ => error("Unexpected failure of tokenizing input:\n" + input.toString)
 | 
| 34166 | 134  | 
}  | 
| 
52066
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
135  | 
}  | 
| 34166 | 136  | 
|
| 
55510
 
1585a65aad64
tuned signature -- emphasize line-oriented aspect;
 
wenzelm 
parents: 
55494 
diff
changeset
 | 
137  | 
def scan_line(input: CharSequence, context: Scan.Line_Context): (List[Token], Scan.Line_Context) =  | 
| 
52066
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
138  | 
  {
 | 
| 
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
139  | 
var in: Reader[Char] = new CharSequenceReader(input)  | 
| 
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
140  | 
val toks = new mutable.ListBuffer[Token]  | 
| 
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
141  | 
var ctxt = context  | 
| 
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
142  | 
    while (!in.atEnd) {
 | 
| 
55510
 
1585a65aad64
tuned signature -- emphasize line-oriented aspect;
 
wenzelm 
parents: 
55494 
diff
changeset
 | 
143  | 
      Token.Parsers.parse(Token.Parsers.token_line(lexicon, is_command, ctxt), in) match {
 | 
| 55494 | 144  | 
        case Token.Parsers.Success((x, c), rest) => { toks += x; ctxt = c; in = rest }
 | 
145  | 
case Token.Parsers.NoSuccess(_, rest) =>  | 
|
| 
52066
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
146  | 
          error("Unexpected failure of tokenizing input:\n" + rest.source.toString)
 | 
| 
43411
 
0206466ee473
some support for partial scans with explicit context;
 
wenzelm 
parents: 
40533 
diff
changeset
 | 
147  | 
}  | 
| 
 
0206466ee473
some support for partial scans with explicit context;
 
wenzelm 
parents: 
40533 
diff
changeset
 | 
148  | 
}  | 
| 
52066
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
149  | 
(toks.toList, ctxt)  | 
| 
 
83b7b88770c9
discontinued odd workaround for scala-2.9.2, which is hopefully obsolete in scala-2.10.x;
 
wenzelm 
parents: 
50428 
diff
changeset
 | 
150  | 
}  | 
| 55616 | 151  | 
|
152  | 
||
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
153  | 
/* parse_spans */  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
154  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
155  | 
def parse_spans(toks: List[Token]): List[Command_Span.Span] =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
156  | 
  {
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
157  | 
val result = new mutable.ListBuffer[Command_Span.Span]  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
158  | 
val content = new mutable.ListBuffer[Token]  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
159  | 
val improper = new mutable.ListBuffer[Token]  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
160  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
161  | 
def ship(span: List[Token])  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
162  | 
    {
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
163  | 
val kind =  | 
| 57910 | 164  | 
        if (!span.isEmpty && span.head.is_command && !span.exists(_.is_error)) {
 | 
165  | 
val name = span.head.source  | 
|
| 
57911
 
dcb758188aa6
clarified Position.Identified: do not require range from prover, default to command position;
 
wenzelm 
parents: 
57910 
diff
changeset
 | 
166  | 
val pos = Position.Range(Text.Range(0, Symbol.iterator(name).length) + 1)  | 
| 57910 | 167  | 
Command_Span.Command_Span(name, pos)  | 
168  | 
}  | 
|
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
169  | 
else if (span.forall(_.is_improper)) Command_Span.Ignored_Span  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
170  | 
else Command_Span.Malformed_Span  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
171  | 
result += Command_Span.Span(kind, span)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
172  | 
}  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
173  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
174  | 
def flush()  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
175  | 
    {
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
176  | 
      if (!content.isEmpty) { ship(content.toList); content.clear }
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
177  | 
      if (!improper.isEmpty) { ship(improper.toList); improper.clear }
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
178  | 
}  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
179  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
180  | 
    for (tok <- toks) {
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
181  | 
      if (tok.is_command) { flush(); content += tok }
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
182  | 
else if (tok.is_improper) improper += tok  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
183  | 
      else { content ++= improper; improper.clear; content += tok }
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
184  | 
}  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
185  | 
flush()  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
186  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
187  | 
result.toList  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
188  | 
}  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
189  | 
|
| 57906 | 190  | 
def parse_spans(input: CharSequence): List[Command_Span.Span] =  | 
191  | 
parse_spans(scan(input))  | 
|
192  | 
||
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents: 
57901 
diff
changeset
 | 
193  | 
|
| 55616 | 194  | 
/* language context */  | 
195  | 
||
| 55749 | 196  | 
def set_language_context(context: Completion.Language_Context): Outer_Syntax =  | 
| 55616 | 197  | 
new Outer_Syntax(keywords, lexicon, completion, context, has_tokens)  | 
198  | 
||
199  | 
def no_tokens: Outer_Syntax =  | 
|
200  | 
  {
 | 
|
201  | 
require(keywords.isEmpty && lexicon.isEmpty)  | 
|
202  | 
new Outer_Syntax(  | 
|
203  | 
completion = completion,  | 
|
| 55749 | 204  | 
language_context = language_context,  | 
| 55616 | 205  | 
has_tokens = false)  | 
206  | 
}  | 
|
| 34166 | 207  | 
}  |