summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/paca.mjs20
-rw-r--r--tests/paca.mjs40
2 files changed, 34 insertions, 26 deletions
diff --git a/src/paca.mjs b/src/paca.mjs
index 993d26c..380200a 100644
--- a/src/paca.mjs
+++ b/src/paca.mjs
@@ -36,12 +36,6 @@ const tokenizeRegexStep = chars => ({ out, state }, char, index) => {
}
if (char === "\\") {
- if (next === undefined) {
- throw new SyntaxError(
- `bad trailing escape character: ${chars}`,
- );
- }
-
return {
out,
state: ConcatStep.ESCAPING,
@@ -61,8 +55,18 @@ const tokenizeRegexFn = chars =>
state: ConcatStep.ACCEPTING,
});
-const tokenizeRegex = chars =>
- tokenizeRegexFn(chars).out;
+const tokenizeRegex = chars => {
+ const tokens = tokenizeRegexFn(chars);
+ if (!!tokens.error) {
+ throw tokens.error;
+ }
+
+ if (tokens.state !== ConcatStep.ACCEPTING) {
+ throw new SyntaxError("bad ending state: " + tokens.state);
+ }
+
+ return tokens.out;
+};
const PRECEDENCE = {
"(": 4,
diff --git a/tests/paca.mjs b/tests/paca.mjs
index 0724bf2..aa7333b 100644
--- a/tests/paca.mjs
+++ b/tests/paca.mjs
@@ -178,24 +178,6 @@ const test_tokenizeRegexStep = t => {
}
});
- t.testing("trailing escape errors", () => {
- try {
- t.assertEq(tokenizeRegexStep("\\")({
- out: [],
- index: 0,
- state: ConcatStep.ACCEPTING,
- }, "\\"), null);
- t.assertEq(true, false);
- } catch (e) {
- const message = "bad trailing escape character: ";
- t.assertEq(
- e.message.substring(0, message.length),
- message,
- );
- t.assertEq(e instanceof SyntaxError, true);
- }
- });
-
t.testing("escape makes it enter escaping mode", () => {
const stepFn = tokenizeRegexStep("\\a\\*");
const steps = [{
@@ -474,6 +456,28 @@ const test_tokenizeRegex = t => {
);
}
});
+
+ t.testing("trailing escape errors", () => {
+ try {
+ t.assertEq(tokenizeRegex(explode("\\")), null);
+ t.assertEq(true, false);
+ } catch (e) {
+ const message = "bad ending state: escaping";
+ t.assertEq(e.message, message);
+ t.assertEq(e instanceof SyntaxError, true);
+ }
+ });
+
+ t.testing("trailing range errors", () => {
+ try {
+ t.assertEq(tokenizeRegex(explode("{")), null);
+ t.assertEq(true, false);
+ } catch (e) {
+ const message = "bad ending state: range";
+ t.assertEq(e.message, message);
+ t.assertEq(e instanceof SyntaxError, true);
+ }
+ });
};
const test_shouldPush = t => {