diff --git a/basic/error.go b/basic/error.go index fec162d..24a9c17 100644 --- a/basic/error.go +++ b/basic/error.go @@ -10,24 +10,22 @@ var ( errInvalidToken = errors.New("invalid token") ) -func newErrInvalidToken(t *token) *lexer.Error { - err := &lexer.Error{ - Line: t.pos.Line, - Column: t.pos.Column, - Content: t.value, - Err: errInvalidToken, - } - return err -} - -func (dec *decoder) OnError(pos lexer.Position, content string, err error) error { - err = &lexer.Error{ +func newError(pos lexer.Position, content, hint string, err error) *lexer.Error { + return &lexer.Error{ Line: pos.Line, Column: pos.Column, Content: content, + Hint: hint, Err: err, } +} +func newErrInvalidToken(t *token) *lexer.Error { + return newError(t.pos, t.value, "", errInvalidToken) +} + +func (dec *decoder) OnError(pos lexer.Position, content string, err error) error { + err = newError(pos, content, "", err) dec.executeFinal() return err } diff --git a/basic/token.go b/basic/token.go index 4f2103b..955f71b 100644 --- a/basic/token.go +++ b/basic/token.go @@ -29,7 +29,7 @@ func (dec *decoder) executeFinal() { } } -func (dec *decoder) execute(typ parser.TokenType) { +func (dec *decoder) execute(typ parser.TokenType) error { switch typ { case parser.TokenSectionEnd: name1, ok1 := dec.getValue(1, parser.TokenSectionName) @@ -48,6 +48,8 @@ func (dec *decoder) execute(typ parser.TokenType) { dec.addField(key, value) dec.reset() } + + return nil } func (dec *decoder) addSection(key, id string, allowEmptyID bool) { @@ -136,19 +138,25 @@ func (dec *decoder) typeOK(typ parser.TokenType) bool { } func (dec *decoder) OnToken(pos lexer.Position, typ parser.TokenType, value string) error { + var err error t := &token{pos, typ, value} switch { case typ == parser.TokenComment: // ignore comments - return nil case dec.typeOK(typ): // acceptable token dec.queue = append(dec.queue, t) - dec.execute(typ) - return nil + err = dec.execute(typ) default: // unacceptable - return newErrInvalidToken(t) + err = newErrInvalidToken(t) } + + if err != nil { + dec.executeFinal() + return err + } + + return nil }