func (l *LLk) Consume(tt lexer.TokenType) bool {
	if l.tkns[0].Type != tt {
		return false
	}
	l.tkns = l.tkns[1:]
	appendNextToken(l)
	return true
}
Consume will consume the current token and move to the next one if it matches
the provided token, false otherwise.
package grammar
import (
	"fmt"
	"github.com/google/badwolf/bql/lexer"
)
type LLk struct {
	k    int
	c    <-chan lexer.Token
	tkns []lexer.Token
}
func NewLLk(input string, k int) *LLk {
	c := lexer.New(input, 2*k)  
	l := &LLk{
		k: k,
		c: c,
	}
	for i := 0; i < k+1; i++ {
		appendNextToken(l)
	}
	return l
}
func appendNextToken(l *LLk) {
	for t := range l.c {
		l.tkns = append(l.tkns, t)
		return
	}
	l.tkns = append(l.tkns, lexer.Token{Type: lexer.ItemEOF})
}
func (l *LLk) Current() *lexer.Token {
	return &l.tkns[0]
}
func (l *LLk) Peek(k int) (*lexer.Token, error) {
	if k > l.k {
		return nil, fmt.Errorf("grammar.LLk: cannot look ahead %v beyond defined %v", k, l.k)
	}
	if k <= 0 {
		return nil, fmt.Errorf("grammar.LLk: invalid look ahead value %v", k)
	}
	return &l.tkns[k], nil
}
func (l *LLk) CanAccept(tt lexer.TokenType) bool {
	return l.tkns[0].Type == tt
}