function* tokenize(selector) {
const { length } = selector;
let offset = 0;
let column = 0;
let context = ".";
const segments = [];
while (column < length) {
const char = selector[column];
if (char === '"' && selector[column - 1] !== "\\") {
column++;
context = context === '"' ? "" : '"';
continue;
}
if (context === '"') {
column++;
continue;
}
switch (char) {
case ".": {
if (offset < column) {
yield selector.slice(offset, column);
}
offset = column;
column++;
break;
}
case "[": {
if (offset < column) {
yield selector.slice(offset, column);
}
offset = column;
column++;
break;
}
case "]": {
column++;
yield selector.slice(offset, column);
offset = column;
break;
}
default: {
column++;
}
}
}
if (offset < column && context != '"') {
yield selector.slice(offset, column);
}
}