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 { |