src/Pure/General/scan.scala
changeset 34164 0a0a19153626
parent 34153 bd7b3b91abab
child 34187 7b659c1561f1
     1.1 --- a/src/Pure/General/scan.scala	Mon Dec 21 16:50:28 2009 +0000
     1.2 +++ b/src/Pure/General/scan.scala	Tue Dec 22 14:58:13 2009 +0100
     1.3 @@ -135,9 +135,9 @@
     1.4      }.named("keyword")
     1.5  
     1.6  
     1.7 -    /* symbols */
     1.8 +    /* symbol range */
     1.9  
    1.10 -    def symbols(pred: String => Boolean, min_count: Int, max_count: Int): Parser[String] =
    1.11 +    def symbol_range(pred: String => Boolean, min_count: Int, max_count: Int): Parser[String] =
    1.12        new Parser[String]
    1.13        {
    1.14          def apply(in: Input) =
    1.15 @@ -161,11 +161,11 @@
    1.16            if (count < min_count) Failure("bad input", in)
    1.17            else Success(in.source.subSequence(start, i).toString, in.drop(i - start))
    1.18          }
    1.19 -      }.named("symbols")
    1.20 +      }.named("symbol_range")
    1.21  
    1.22 -    def one(pred: String => Boolean): Parser[String] = symbols(pred, 1, 1)
    1.23 -    def many(pred: String => Boolean): Parser[String] = symbols(pred, 0, Integer.MAX_VALUE)
    1.24 -    def many1(pred: String => Boolean): Parser[String] = symbols(pred, 1, Integer.MAX_VALUE)
    1.25 +    def one(pred: String => Boolean): Parser[String] = symbol_range(pred, 1, 1)
    1.26 +    def many(pred: String => Boolean): Parser[String] = symbol_range(pred, 0, Integer.MAX_VALUE)
    1.27 +    def many1(pred: String => Boolean): Parser[String] = symbol_range(pred, 1, Integer.MAX_VALUE)
    1.28  
    1.29  
    1.30      /* quoted strings */
    1.31 @@ -246,38 +246,41 @@
    1.32      def token(symbols: Symbol.Interpretation, is_command: String => Boolean):
    1.33        Parser[Outer_Lex.Token] =
    1.34      {
    1.35 -      import Outer_Lex._
    1.36 +      import Outer_Lex.Token_Kind, Outer_Lex.Token
    1.37  
    1.38        val id = one(symbols.is_letter) ~ many(symbols.is_letdig) ^^ { case x ~ y => x + y }
    1.39        val nat = many1(symbols.is_digit)
    1.40        val id_nat = id ~ opt("." ~ nat) ^^ { case x ~ Some(y ~ z) => x + y + z case x ~ None => x }
    1.41  
    1.42        val ident = id ~ rep("." ~> id) ^^
    1.43 -        { case x ~ Nil => Ident(x)
    1.44 -          case x ~ ys => Long_Ident((x :: ys).mkString(".")) }
    1.45 +        { case x ~ Nil => Token(Token_Kind.IDENT, x)
    1.46 +          case x ~ ys => Token(Token_Kind.LONG_IDENT, (x :: ys).mkString(".")) }
    1.47  
    1.48 -      val var_ = "?" ~ id_nat ^^ { case x ~ y => Var(x + y) }
    1.49 -      val type_ident = "'" ~ id ^^ { case x ~ y => Type_Ident(x + y) }
    1.50 -      val type_var = "?'" ~ id_nat ^^ { case x ~ y => Type_Var(x + y) }
    1.51 -      val nat_ = nat ^^ Nat
    1.52 +      val var_ = "?" ~ id_nat ^^ { case x ~ y => Token(Token_Kind.VAR, x + y) }
    1.53 +      val type_ident = "'" ~ id ^^ { case x ~ y => Token(Token_Kind.TYPE_IDENT, x + y) }
    1.54 +      val type_var = "?'" ~ id_nat ^^ { case x ~ y => Token(Token_Kind.TYPE_VAR, x + y) }
    1.55 +      val nat_ = nat ^^ (x => Token(Token_Kind.NAT, x))
    1.56  
    1.57        val sym_ident =
    1.58          (many1(symbols.is_symbolic_char) |
    1.59 -          one(sym => symbols.is_symbolic(sym) & Symbol.is_closed(sym))) ^^ Sym_Ident
    1.60 +          one(sym => symbols.is_symbolic(sym) & Symbol.is_closed(sym))) ^^
    1.61 +        (x => Token(Token_Kind.SYM_IDENT, x))
    1.62  
    1.63 -      val space = many1(symbols.is_blank) ^^ Space
    1.64 +      val space = many1(symbols.is_blank) ^^ (x => Token(Token_Kind.SPACE, x))
    1.65  
    1.66 -      val string = quoted("\"") ^^ String_Token
    1.67 -      val alt_string = quoted("`") ^^ Alt_String_Token
    1.68 +      val string = quoted("\"") ^^ (x => Token(Token_Kind.STRING, x))
    1.69 +      val alt_string = quoted("`") ^^ (x => Token(Token_Kind.ALT_STRING, x))
    1.70  
    1.71 -      val bad_input = many1(sym => !(symbols.is_blank(sym))) ^^ Bad_Input
    1.72 +      val bad_input = many1(sym => !(symbols.is_blank(sym))) ^^
    1.73 +        (x => Token(Token_Kind.BAD_INPUT, x))
    1.74  
    1.75  
    1.76        /* tokens */
    1.77  
    1.78 -      (space | (string | (alt_string | (verbatim ^^ Verbatim | comment ^^ Comment)))) |
    1.79 +      (space | (string | (alt_string | (verbatim ^^ (x => Token(Token_Kind.VERBATIM, x)) |
    1.80 +        comment ^^ (x => Token(Token_Kind.COMMENT, x)))))) |
    1.81        ((ident | (var_ | (type_ident | (type_var | (nat_ | sym_ident))))) |||
    1.82 -        keyword ^^ (x => if (is_command(x)) Command(x) else Keyword(x))) |
    1.83 +        keyword ^^ (x => Token(if (is_command(x)) Token_Kind.COMMAND else Token_Kind.KEYWORD, x))) |
    1.84        bad_input
    1.85      }
    1.86    }