summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/paca.mjs34
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];