2025-12-24 17:40:52 +08:00
|
|
|
package aviation
|
|
|
|
|
|
|
|
|
|
import "strings"
|
|
|
|
|
|
|
|
|
|
// Token represents a lexeme in the body with its byte offsets.
|
|
|
|
|
type Token struct {
|
|
|
|
|
Text string
|
|
|
|
|
Start int
|
|
|
|
|
End int
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Tokenizer splits text into tokens using a whitespace set.
|
2025-12-26 17:55:25 +08:00
|
|
|
// Whitespace characters split tokens but are not emitted.
|
|
|
|
|
// All other characters (including '/') are included in tokens.
|
2025-12-24 17:40:52 +08:00
|
|
|
type Tokenizer struct {
|
|
|
|
|
Whitespace string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Tokenize tokenizes input and returns tokens with byte offsets.
|
|
|
|
|
func (t Tokenizer) Tokenize(input string) []Token {
|
|
|
|
|
if t.Whitespace == "" {
|
|
|
|
|
t.Whitespace = " \n\t\r"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var tokens []Token
|
|
|
|
|
start := -1
|
|
|
|
|
|
|
|
|
|
for idx, r := range input {
|
|
|
|
|
if strings.ContainsRune(t.Whitespace, r) {
|
|
|
|
|
if start != -1 {
|
|
|
|
|
tokens = append(tokens, Token{
|
|
|
|
|
Text: input[start:idx],
|
|
|
|
|
Start: start,
|
|
|
|
|
End: idx,
|
|
|
|
|
})
|
|
|
|
|
start = -1
|
|
|
|
|
}
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if start == -1 {
|
|
|
|
|
start = idx
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if start != -1 {
|
|
|
|
|
tokens = append(tokens, Token{
|
|
|
|
|
Text: input[start:],
|
|
|
|
|
Start: start,
|
|
|
|
|
End: len(input),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return tokens
|
|
|
|
|
}
|