43 lines
969 B
Go
43 lines
969 B
Go
package parser
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/kashav/fsql/tokenizer"
|
|
)
|
|
|
|
// ErrUnexpectedToken represents an unexpected token error.
|
|
type ErrUnexpectedToken struct {
|
|
Actual tokenizer.TokenType
|
|
Expected tokenizer.TokenType
|
|
}
|
|
|
|
func (e *ErrUnexpectedToken) Error() string {
|
|
return fmt.Sprintf("expected %s; got %s", e.Expected.String(),
|
|
e.Actual.String())
|
|
}
|
|
|
|
// ErrUnknownToken represents an unknown token error.
|
|
type ErrUnknownToken struct {
|
|
Raw string
|
|
}
|
|
|
|
func (e *ErrUnknownToken) Error() string {
|
|
return fmt.Sprintf("unknown token: %s", e.Raw)
|
|
}
|
|
|
|
// currentError returns the current error, based on the parser's current Token
|
|
// and the previously expected TokenType (set in parser.expect).
|
|
func (p *parser) currentError() error {
|
|
if p.current == nil {
|
|
return io.ErrUnexpectedEOF
|
|
}
|
|
|
|
if p.current.Type == tokenizer.Unknown {
|
|
return &ErrUnknownToken{Raw: p.current.Raw}
|
|
}
|
|
|
|
return &ErrUnexpectedToken{Actual: p.current.Type, Expected: p.expected}
|
|
}
|