github.com/mithrandie/csvq@v1.18.1/lib/parser/lexer.go (about) 1 package parser 2 3 import ( 4 "fmt" 5 ) 6 7 type Lexer struct { 8 Scanner 9 program []Statement 10 token Token 11 err error 12 } 13 14 func (l *Lexer) Lex(lval *yySymType) int { 15 tok, err := l.Scan() 16 lval.token = tok 17 l.token = lval.token 18 19 if err != nil { 20 l.Error(err.Error()) 21 } 22 23 return lval.token.Token 24 } 25 26 func (l *Lexer) Error(e string) { 27 if e == "syntax error" { 28 if l.token.Token == EOF { 29 l.err = NewSyntaxError(fmt.Sprintf("%s: unexpected termination", e), l.token) 30 } else { 31 l.err = NewSyntaxError(fmt.Sprintf("%s: unexpected token %q", e, l.token.Literal), l.token) 32 } 33 } else { 34 l.err = NewSyntaxError(fmt.Sprintf("%s", e), l.token) 35 } 36 } 37 38 type Token struct { 39 Token int 40 Literal string 41 Quoted bool 42 HolderOrdinal int 43 Line int 44 Char int 45 SourceFile string 46 } 47 48 func (t Token) IsEmpty() bool { 49 return t.Token == 0 50 } 51 52 func (t Token) String() string { 53 if lit, err := KeywordLiteral(t.Token); err == nil { 54 return lit 55 } 56 return t.Literal 57 } 58 59 type SyntaxError struct { 60 SourceFile string 61 Line int 62 Char int 63 Message string 64 } 65 66 func (e SyntaxError) Error() string { 67 return e.Message 68 } 69 70 func NewSyntaxError(message string, token Token) error { 71 return &SyntaxError{ 72 SourceFile: token.SourceFile, 73 Line: token.Line, 74 Char: token.Char, 75 Message: message, 76 } 77 }