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  }