···
+
const syntaxError = (char) => {
+
throw new SyntaxError('Unexpected token "' + char + '"');
export const parse = (quasis, expressions) => {
···
let currentSequence = rootSequence;
+
let quasiIndex = 0, stackIndex = 0;
+
stackIndex < quasis.length + expressions.length;
if (stackIndex % 2 !== 0) {
expression: expressions[stackIndex++ >> 1],
···
const quasi = quasis[stackIndex >> 1];
+
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();
+
if (!currentSequence) syntaxError(char);
} else if (char === '(') {
sequenceStack.push(currentSequence);
+
currentSequence.push((currentGroup = { sequence: [] }));
currentSequence = currentGroup.sequence;
} else if (char === '?' && !currentSequence.length && currentGroup) {
const nextChar = quasi[quasiIndex++];
+
if (nextChar === ':' || nextChar === '=' || nextChar === '!') {
currentGroup.capture = nextChar;
(char === '?' || char === '+' || char === '*') &&
(lastMatch = currentSequence[currentSequence.length - 1])
lastMatch.quantifier = char;