src/Pure/Isar/token.scala
changeset 56464 555f4be59be6
parent 55512 75c68e05f9ea
child 56532 3da244bc02bd
equal deleted inserted replaced
56463:013dfac0811a 56464:555f4be59be6
   119   }
   119   }
   120 
   120 
   121 
   121 
   122   /* token reader */
   122   /* token reader */
   123 
   123 
   124   class Position(val line: Int, val file: String) extends scala.util.parsing.input.Position
   124   object Pos
       
   125   {
       
   126     val none: Pos = new Pos(0, "")
       
   127   }
       
   128 
       
   129   final class Pos private[Token](val line: Int, val file: String)
       
   130     extends scala.util.parsing.input.Position
   125   {
   131   {
   126     def column = 0
   132     def column = 0
   127     def lineContents = ""
   133     def lineContents = ""
   128     override def toString =
   134 
   129       if (file == "") ("line " + line.toString)
   135     def advance(token: Token): Pos =
   130       else ("line " + line.toString + " of " + quote(file))
       
   131 
       
   132     def advance(token: Token): Position =
       
   133     {
   136     {
   134       var n = 0
   137       var n = 0
   135       for (c <- token.content if c == '\n') n += 1
   138       for (c <- token.content if c == '\n') n += 1
   136       if (n == 0) this else new Position(line + n, file)
   139       if (n == 0) this else new Pos(line + n, file)
   137     }
   140     }
       
   141 
       
   142     def position: Position.T = Position.Line_File(line, file)
       
   143     override def toString: String = Position.here(position)
   138   }
   144   }
   139 
   145 
   140   abstract class Reader extends scala.util.parsing.input.Reader[Token]
   146   abstract class Reader extends scala.util.parsing.input.Reader[Token]
   141 
   147 
   142   private class Token_Reader(tokens: List[Token], val pos: Position) extends Reader
   148   private class Token_Reader(tokens: List[Token], val pos: Pos) extends Reader
   143   {
   149   {
   144     def first = tokens.head
   150     def first = tokens.head
   145     def rest = new Token_Reader(tokens.tail, pos.advance(first))
   151     def rest = new Token_Reader(tokens.tail, pos.advance(first))
   146     def atEnd = tokens.isEmpty
   152     def atEnd = tokens.isEmpty
   147   }
   153   }
   148 
   154 
   149   def reader(tokens: List[Token], file: String = ""): Reader =
   155   def reader(tokens: List[Token], file: String = ""): Reader =
   150     new Token_Reader(tokens, new Position(1, file))
   156     new Token_Reader(tokens, new Pos(1, file))
   151 }
   157 }
   152 
   158 
   153 
   159 
   154 sealed case class Token(val kind: Token.Kind.Value, val source: String)
   160 sealed case class Token(val kind: Token.Kind.Value, val source: String)
   155 {
   161 {