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 {
|
|
if pos.Char == EOF {
|
|
continue
|
|
}
|
|
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(),
|
|
}
|
|
}
|