| @ -1,7 +1,63 @@ | |||
| package scanner | |||
| import ( | |||
| "github.com/brettlangdon/gython/token" | |||
| ) | |||
| type Position struct { | |||
| Line int | |||
| Column int | |||
| Char rune | |||
| } | |||
| type Positions struct { | |||
| positions []*Position | |||
| } | |||
| func NewPositions() *Positions { | |||
| return &Positions{ | |||
| positions: make([]*Position, 0), | |||
| } | |||
| } | |||
| func (positions *Positions) Append(pos *Position) { | |||
| positions.positions = append(positions.positions, pos) | |||
| } | |||
| func (positions *Positions) StartingLine() int { | |||
| return positions.positions[0].Line | |||
| } | |||
| func (positions *Positions) EndingLine() int { | |||
| last := len(positions.positions) - 1 | |||
| return positions.positions[last].Line | |||
| } | |||
| func (positions *Positions) StartingColumn() int { | |||
| return positions.positions[0].Column | |||
| } | |||
| func (positions *Positions) EndingColumn() int { | |||
| last := len(positions.positions) - 1 | |||
| return positions.positions[last].Column | |||
| } | |||
| func (positions *Positions) String() string { | |||
| literal := "" | |||
| for _, pos := range positions.positions { | |||
| literal += string(pos.Char) | |||
| } | |||
| return literal | |||
| } | |||
| func (positions *Positions) AsToken(id token.TokenID) *token.Token { | |||
| return &token.Token{ | |||
| ID: id, | |||
| LineStart: positions.StartingLine(), | |||
| ColumnStart: positions.StartingColumn(), | |||
| LineEnd: positions.EndingLine(), | |||
| ColumnEnd: positions.EndingColumn(), | |||
| Literal: positions.String(), | |||
| } | |||
| } | |||