lox-go/lexer/tokentype.go
2025-06-08 15:02:35 -04:00

91 lines
1.3 KiB
Go

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
}