about summary refs log tree commit diff
path: root/pkg/lang/scanner/token/token.go
blob: 9fee730f709fc7df27bf297a098b8560cfa5ab80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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"
	}
}