src/Pure/Isar/token.scala
changeset 59671 9715eb8e9408
parent 59122 c1dbcde94cd2
child 59695 a03e0561bdbf
equal deleted inserted replaced
59666:0e9f303d1515 59671:9715eb8e9408
   155 
   155 
   156   /* token reader */
   156   /* token reader */
   157 
   157 
   158   object Pos
   158   object Pos
   159   {
   159   {
   160     val none: Pos = new Pos(0, "")
   160     val none: Pos = new Pos()
   161   }
   161   }
   162 
   162 
   163   final class Pos private[Token](val line: Int, val file: String)
   163   final class Pos private[Token](
       
   164       val line: Int = 0,
       
   165       val offset: Symbol.Offset = 0,
       
   166       val file: String = "",
       
   167       val id: Document_ID.Generic = Document_ID.none)
   164     extends scala.util.parsing.input.Position
   168     extends scala.util.parsing.input.Position
   165   {
   169   {
   166     def column = 0
   170     def column = 0
   167     def lineContents = ""
   171     def lineContents = ""
   168 
   172 
   169     def advance(token: Token): Pos =
   173     def advance(token: Token): Pos =
   170     {
   174     {
   171       var n = 0
   175       var line1 = line
   172       for (c <- token.content if c == '\n') n += 1
   176       var offset1 = offset
   173       if (n == 0) this else new Pos(line + n, file)
   177       for (s <- Symbol.iterator(token.source)) {
   174     }
   178         if (line1 > 0 && Symbol.is_newline(s)) line1 += 1
   175 
   179         if (offset1 > 0) offset1 += 1
   176     def position: Position.T = Position.Line_File(line, file)
   180       }
   177     override def toString: String = Position.here_undelimited(position)
   181       if (line1 == line && offset1 == offset) this
       
   182       else new Pos(line1, offset1, file, id)
       
   183     }
       
   184 
       
   185     def position(end_offset: Symbol.Offset): Position.T =
       
   186       (if (line > 0) Position.Line(line) else Nil) :::
       
   187       (if (offset > 0) Position.Offset(offset) else Nil) :::
       
   188       (if (end_offset > 0) Position.End_Offset(end_offset) else Nil) :::
       
   189       (if (file != "") Position.File(file) else Nil) :::
       
   190       (if (id != Document_ID.none) Position.Id(id) else Nil)
       
   191 
       
   192     def position(): Position.T = position(0)
       
   193     def position(token: Token): Position.T = position(advance(token).offset)
       
   194 
       
   195     override def toString: String = Position.here_undelimited(position())
   178   }
   196   }
   179 
   197 
   180   abstract class Reader extends scala.util.parsing.input.Reader[Token]
   198   abstract class Reader extends scala.util.parsing.input.Reader[Token]
   181 
   199 
   182   private class Token_Reader(tokens: List[Token], val pos: Pos) extends Reader
   200   private class Token_Reader(tokens: List[Token], val pos: Pos) extends Reader
   184     def first = tokens.head
   202     def first = tokens.head
   185     def rest = new Token_Reader(tokens.tail, pos.advance(first))
   203     def rest = new Token_Reader(tokens.tail, pos.advance(first))
   186     def atEnd = tokens.isEmpty
   204     def atEnd = tokens.isEmpty
   187   }
   205   }
   188 
   206 
   189   def reader(tokens: List[Token], file: String = ""): Reader =
   207   def reader(tokens: List[Token], file: String = "", id: Document_ID.Generic = Document_ID.none)
   190     new Token_Reader(tokens, new Pos(1, file))
   208     : Reader = new Token_Reader(tokens, new Pos(1, 1, file, id))
   191 }
   209 }
   192 
   210 
   193 
   211 
   194 sealed case class Token(val kind: Token.Kind.Value, val source: String)
   212 sealed case class Token(val kind: Token.Kind.Value, val source: String)
   195 {
   213 {