| @ -1,7 +1,63 @@ | |||||
| package scanner | package scanner | ||||
| import ( | |||||
| "github.com/brettlangdon/gython/token" | |||||
| ) | |||||
| type Position struct { | type Position struct { | ||||
| Line int | Line int | ||||
| Column int | Column int | ||||
| Char rune | 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(), | |||||
| } | |||||
| } | |||||