package main 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 }