diff --git a/scanner/position.go b/scanner/position.go index 199dccf..e48e7ca 100644 --- a/scanner/position.go +++ b/scanner/position.go @@ -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(), + } +}