package token import ( "fmt" "jinx/pkg/libs/source" ) type Token struct { Kind TokenKind At source.Loc Data any } func Simple(kind TokenKind, at source.Loc) Token { return Token{ Kind: kind, At: at, } } func New(kind TokenKind, at source.Loc, data any) Token { return Token{ Kind: kind, At: at, Data: data, } } func (t Token) CanEndStmt() bool { switch t.Kind { case EOF, EOL, SemiColon: return true default: return false } } func (t Token) String() string { switch t.Kind { case EOF, EOL: return t.Kind.String() case KwVar, KwFn, KwType, KwIf, KwElif, KwElse, KwFor, KwTry, KwCatch, KwFinally, KwReturn, KwContinue, KwBreak, KwThrow, KwIn, KwNull, KwTrue, KwFalse, KwThis, KwUse, KwFrom, KwBy, KwGlobal: return fmt.Sprintf("keyword '%v'", t.Kind) case Ident: return fmt.Sprintf("identifier '%v'", t.Data) case Int: return fmt.Sprintf("integer '%v'", t.Data) case Float: return fmt.Sprintf("float '%v'", t.Data) case String: return fmt.Sprintf("string '%v'", t.Data) case Assign, Plus, Minus, Star, Slash, Percent, Bang, Eq, Neq, Lt, Gt, Lte, Gte, LParen, RParen, LBrace, RBrace, LBracket, RBracket, Comma, Dot, SemiColon: return fmt.Sprintf("'%v'", t.Kind) default: return "unknown token" } }