package parser import ( "io/fs" "asciigoat.org/core/lexer" ) // NewError creates a lexer.Error using a lexer.Position 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, } } // ErrPlusPosition returns a copy of the given [lexer.Error] // offsetting the Line/Column information. func ErrPlusPosition(pos lexer.Position, e *lexer.Error) *lexer.Error { pos.Add(lexer.Position{ Line: e.Line, Column: e.Column, }) return NewError(pos, e.Content, e.Hint, e.Err) } // NewErrIncompleteQuotedString returns a [lexer.Error] // indicating the quoted string being parsed wasn't correctly // terminated func NewErrIncompleteQuotedString(p *TextParser) *lexer.Error { return newErrIncomplete(p, "incomplete quoted string") } // NewErrIncompleteEscaped returns a [lexer.Error] // indicating the text being parsed wasn't correctly // terminated func NewErrIncompleteEscaped(p *TextParser) *lexer.Error { return newErrIncomplete(p, "incomplete escaped string") } func newErrIncomplete(p *TextParser, hint string) *lexer.Error { pos, s := p.Emit() pos.Add(GetPositionalLength(s)) return NewError(pos, s, hint, fs.ErrInvalid) } // NewErrInvalidEscapeSequence returns a [lexer.Error] indicating // the specified sequence, at the end of the accepted buffer, // is invalid func NewErrInvalidEscapeSequence(p *TextParser, seq string) *lexer.Error { pos, s := p.Position(), p.String() s = s[:len(s)-len(seq)] pos.Add(GetPositionalLength(s)) return NewError(pos, seq, "invalid escape character", fs.ErrInvalid) }