package lexer import "fmt" // Position indicates a line and column pair on a file. // Counting starts at 1. type Position struct { Line int Column int } // String generates a pretty "(Line, Column)"" representation of the Position func (p Position) String() string { if p.Line == 0 { p.Reset() } return fmt.Sprintf("(%v, %v)", p.Line, p.Column) } // GoString generates a string representation of the Position for %#v usage func (p Position) GoString() string { if p.Line == 0 { p.Reset() } return fmt.Sprintf("lexer.Position{%v, %v}", p.Line, p.Column) } // Reset places a position at (1,1) func (p *Position) Reset() { p.Line, p.Column = 1, 1 } // Step moves the column one place func (p *Position) Step() { if p.Line == 0 { p.Reset() } p.Column++ } // Next returns a new Position one rune forward // on the line func (p Position) Next() Position { if p.Line == 0 { p.Reset() } return Position{ Line: p.Line, Column: p.Column + 1, } } // NextLine returns a new Position at the begining of the next // line. func (p Position) NextLine() Position { if p.Line == 0 { p.Reset() } return Position{ Line: p.Line + 1, Column: 1, } }