aboutsummaryrefslogtreecommitdiff
path: root/token.go
blob: b1e2dd8b4f1f4d1c13e338902e12273144bc5d4e (plain) (blame)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org>
//
// SPDX-License-Identifier: GPL-3.0-or-later

package main

type tokenKind int

func (k tokenKind) String() string {
	switch k {
	case plusEquals:
		return "+="
	case plus:
		return "+"
	case minusEquals:
		return "-="
	case minus:
		return "-"
	case starEquals:
		return "*="
	case star:
		return "*"
	case slashEquals:
		return "/="
	case slash:
		return "/"
	case percentageEquals:
		return "%="
	case percentage:
		return "%"
	case lparen:
		return "("
	case rparen:
		return ")"
	case lbracket:
		return "["
	case rbracket:
		return "]"
	case lbrace:
		return "{"
	case rbrace:
		return "}"
	case comma:
		return ","
	case dot:
		return "."
	case colon:
		return ":"
	case semicolon:
		return ";"
	case doubleEquals:
		return "=="
	case equals:
		return "="
	case bangEquals:
		return "!="
	case bang:
		return "!"
	case tildeEquals:
		return "~="
	case tilde:
		return "~"
	case caretEquals:
		return "^="
	case caret:
		return "^"
	case doubleAmpersand:
		return "&&"
	case ampersandEquals:
		return "&="
	case ampersand:
		return "&"
	case doublePipe:
		return "||"
	case pipeEquals:
		return "|="
	case pipe:
		return "|"
	case doubleLangleEquals:
		return "<<="
	case doubleLangle:
		return "<<"
	case langleEquals:
		return "<="
	case langle:
		return "<"
	case doubleRangleEquals:
		return ">>="
	case doubleRangle:
		return ">>"
	case rangleEquals:
		return ">="
	case rangle:
		return ">"
	case identifier:
		return "identifier"
	case str:
		return "string"
	case number:
		return "number"
	case export:
		return "export"
	case extern:
		return "extern"
	case function:
		return "func"
	case ret:
		return "return"
	case constKeyword:
		return "const"
	case mut:
		return "mut"
	}

	return "invalid token"
}

const (
	none tokenKind = iota
	plusEquals
	plus
	minusEquals
	minus
	starEquals
	star
	slashEquals
	slash
	percentageEquals
	percentage
	lparen
	rparen
	lbracket
	rbracket
	lbrace
	rbrace
	comma
	dot
	colon
	semicolon
	doubleEquals
	equals
	bangEquals
	bang
	tildeEquals
	tilde
	caretEquals
	caret
	doubleAmpersand
	ampersandEquals
	ampersand
	doublePipe
	pipeEquals
	pipe
	doubleLangleEquals
	doubleLangle
	langleEquals
	langle
	doubleRangleEquals
	doubleRangle
	rangleEquals
	rangle
	identifier
	str
	number
	export
	extern
	function
	ret
	constKeyword
	mut
)

type token struct {
	kind  tokenKind
	value string
	line  int
}

func (t token) String() string {
	if t.value != "" {
		return t.kind.String() + " " + t.value
	} else {
		return t.kind.String()
	}
}

type tokens struct {
	src   <-chan token
	toks  []token
	index int
}