src/Pure/Thy/thy_syntax.scala
author wenzelm
Sun, 08 Aug 2010 22:33:41 +0200
changeset 38239 89a4d1028fb3
parent 36956 21be4832c362
child 38373 e8197eea3cd0
permissions -rw-r--r--
parse_spans: somewhat faster low-level implementation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/thy_syntax.scala
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     3
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     4
Superficial theory syntax: command spans.
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     5
*/
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     6
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     7
package isabelle
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     8
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
     9
38239
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    10
import scala.collection.mutable
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    11
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    12
34303
98425e77cfeb plain object;
wenzelm
parents: 34268
diff changeset
    13
object Thy_Syntax
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    14
{
36956
21be4832c362 renamed class Outer_Lex to Token and Token_Kind to Token.Kind;
wenzelm
parents: 36948
diff changeset
    15
  type Span = List[Token]
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    16
36956
21be4832c362 renamed class Outer_Lex to Token and Token_Kind to Token.Kind;
wenzelm
parents: 36948
diff changeset
    17
  def parse_spans(toks: List[Token]): List[Span] =
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    18
  {
38239
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    19
    val result = new mutable.ListBuffer[Span]
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    20
    val span = new mutable.ListBuffer[Token]
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    21
    val whitespace = new mutable.ListBuffer[Token]
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    22
38239
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    23
    def flush(buffer: mutable.ListBuffer[Token])
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    24
    {
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    25
      if (!buffer.isEmpty) { result += buffer.toList; buffer.clear }
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    26
    }
38239
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    27
    for (tok <- toks) {
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    28
      if (tok.is_command) { flush(span); flush(whitespace); span += tok }
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    29
      else if (tok.is_ignored) whitespace += tok
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    30
      else { span ++= whitespace; whitespace.clear; span += tok }
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    31
    }
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    32
    flush(span); flush(whitespace)
89a4d1028fb3 parse_spans: somewhat faster low-level implementation;
wenzelm
parents: 36956
diff changeset
    33
    result.toList
34268
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    34
  }
b149b7083236 separate module Thy_Syntax for command span parsing;
wenzelm
parents:
diff changeset
    35
}