···
1
+
const syntaxError = (char) => {
2
+
throw new SyntaxError('Unexpected token "' + char + '"');
export const parse = (quasis, expressions) => {
···
let currentSequence = rootSequence;
12
-
while (stackIndex < quasis.length + expressions.length) {
17
+
let quasiIndex = 0, stackIndex = 0;
18
+
stackIndex < quasis.length + expressions.length;
if (stackIndex % 2 !== 0) {
expression: expressions[stackIndex++ >> 1],
···
const quasi = quasis[stackIndex >> 1];
20
-
while (quasiIndex < quasi.length) {
28
+
for (quasiIndex = 0; quasiIndex < quasi.length; ) {
const char = quasi[quasiIndex++];
if (char === ' ' || char === '\t' || char === '\r' || char === '\n') {
} else if (char === '|' && currentSequence.length) {
currentSequence = currentSequence.alternation = [];
} else if (char === ')' && currentSequence.length) {
currentSequence = sequenceStack.pop();
31
-
if (currentSequence) continue;
36
+
if (!currentSequence) syntaxError(char);
} else if (char === '(') {
sequenceStack.push(currentSequence);
38
-
currentSequence.push(currentGroup);
39
+
currentSequence.push((currentGroup = { sequence: [] }));
currentSequence = currentGroup.sequence;
} else if (char === '?' && !currentSequence.length && currentGroup) {
const nextChar = quasi[quasiIndex++];
43
-
if (nextChar === ':') {
43
+
if (nextChar === ':' || nextChar === '=' || nextChar === '!') {
currentGroup.capture = nextChar;
46
-
} else if (nextChar === '=') {
47
-
currentGroup.capture = nextChar;
49
-
} else if (nextChar === '!') {
50
-
currentGroup.capture = nextChar;
(char === '?' || char === '+' || char === '*') &&
(lastMatch = currentSequence[currentSequence.length - 1])
lastMatch.quantifier = char;
61
-
throw new SyntaxError('Unexpected token "' + char + '"');