package lexer import "fmt" //go:generate stringer -type TokenType -linecomment -trimprefix TokenType type TokenType int const ( // single char tokens TokenTypeLeftParen TokenType = iota TokenTypeRightParen TokenTypeLeftBrace TokenTypeRightBrace TokenTypeComma TokenTypeDot TokenTypeMinus TokenTypePlus TokenTypeSemicolon TokenTypeSlash TokenTypeStar // 1-2 char token TokenTypeBang TokenTypeBangEq TokenTypeEqual TokenTypeEqualEqual TokenTypeGreater TokenTypeGreaterEq TokenTypeLess TokenTypeLessEq // literals TokenTypeIdentifier TokenTypeString TokenTypeNumber // keywords TokenTypeAnd TokenTypeClass TokenTypeElse TokenTypeFalse TokenTypeFun TokenTypeFor TokenTypeIf TokenTypeNil TokenTypeOr TokenTypePrint TokenTypeReturn TokenTypeSuper TokenTypeThis TokenTypeTrue TokenTypeVar TokenTypeWhile TokenTypeEOF ) var KeywordTokenTypes = []TokenType{ TokenTypeClass, TokenTypeFun, TokenTypeVar, TokenTypeFor, TokenTypeIf, TokenTypeReturn, TokenTypeWhile, TokenTypePrint, } type Token struct { Type TokenType Lexeme string Literal any Line int } func (t Token) String() string { return fmt.Sprintf("%s %s %+v", t.Type, t.Lexeme, t.Literal) } func IsKeyword(token *Token) bool { for _, kt := range KeywordTokenTypes { if token.Type == kt { return true } } return false }