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