lox-go/tokentype.go
2025-06-07 21:16:05 -04:00

91 lines
1.3 KiB
Go

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
}