diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/paca.mjs | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/paca.mjs b/src/paca.mjs index 5d11b05..7a01407 100644 --- a/src/paca.mjs +++ b/src/paca.mjs @@ -24,19 +24,33 @@ const shouldConcat = (char, next) => char !== "{" && !nonConcatOperators.has(next); +const operatorChars = new Set([...nonConcatOperators, "(", "."]); +const isOperator = char => + operatorChars.has(char); + const numFromDigits = digits => digits.length === 0 ? -1 : Number(digits.join("")); -const escapingStateStep = ({ out, _state, context }, char, _index, next) => ({ - out: out.concat( - char, - shouldConcat(null, next) ? [{ operator: "concat" }] : [], - ), - state: ConcatStep.ACCEPTING, - context, -}); +const escapingStateStep = ({ out, state, context }, char, _index, next) => + !(isOperator(char) || char === "\\") + ? reduced({ + out, + state, + context, + error: new SyntaxError( + "unknown escape sequence: \\" + char, + ), + }) + : { + out: out.concat( + char, + shouldConcat(null, next) ? [{ operator: "concat" }] : [], + ), + state: ConcatStep.ACCEPTING, + context, + }; const rangeStateStep = ({ out, state, context }, char, _index, _next) => { if (char === "}") { @@ -313,10 +327,6 @@ const transitionChars = new Set(Object.keys(TRANSITION_FNS)); const isTransition = char => transitionChars.has(char); -const operatorChars = new Set([...nonConcatOperators, "(", "."]); -const isOperator = char => - operatorChars.has(char); - const tokenizeRegexStep = chars => ({ out, state, context }, char, index) => { const next = chars[index + 1]; |
