91 lines
1.3 KiB
Go
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
|
|
}
|