summaryrefslogtreecommitdiff
path: root/src/paca.mjs
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2025-07-20 09:31:16 -0300
committerEuAndreh <eu@euandre.org>2025-07-20 09:31:16 -0300
commit846adfdbb0931b9bda93cf38383103b44d7bd62b (patch)
tree5b321562a45af19f713bac31fcbea3cac35ffa26 /src/paca.mjs
parent.gitignore: Remove trailing slash from node_modules rule (diff)
downloadpaca-846adfdbb0931b9bda93cf38383103b44d7bd62b.tar.gz
paca-846adfdbb0931b9bda93cf38383103b44d7bd62b.tar.xz
Add initial support for caret and dollar metacharacters
Diffstat (limited to '')
-rw-r--r--src/paca.mjs59
1 files changed, 55 insertions, 4 deletions
diff --git a/src/paca.mjs b/src/paca.mjs
index 4a85067..21a28e8 100644
--- a/src/paca.mjs
+++ b/src/paca.mjs
@@ -15,7 +15,7 @@ const ConcatStep = {
CLASS: "class",
};
-const nonConcatOperators = new Set(["*", "+", "?", "|", ")", "$"]);
+const nonConcatOperators = new Set(["*", "+", "?", "|", ")"]);
const shouldConcat = (char, next) =>
next !== undefined &&
@@ -24,7 +24,7 @@ const shouldConcat = (char, next) =>
char !== "{" &&
!nonConcatOperators.has(next);
-const operatorChars = new Set([...nonConcatOperators, "("]);
+const operatorChars = new Set([...nonConcatOperators, "(", "$"]);
const isOperator = char =>
operatorChars.has(char);
@@ -301,7 +301,10 @@ const ANCHOR_FNS = {
),
})
: {
- out: out.concat({ operator: "caret" }),
+ out: out.concat([
+ { meta: "^" },
+ { operator: "concat" },
+ ]),
state,
context,
},
@@ -316,7 +319,7 @@ const ANCHOR_FNS = {
),
})
: {
- out: out.concat({ operator: "dollar" }),
+ out: out.concat([{ meta: "$" }]),
state,
context,
},
@@ -693,6 +696,52 @@ const wildcard = (_edge, id) => {
};
};
+const caret = (_edge, id) => {
+ const start = id + 0;
+ const end = id + 1;
+ return {
+ start,
+ end,
+ nodes: {
+ [start]: {
+ direct: [],
+ transitions: {},
+ meta: {
+ op: "caret",
+ to: end,
+ },
+ },
+ [end]: {
+ direct: [],
+ transitions: {},
+ },
+ },
+ };
+};
+
+const dollar = (_edge, id) => {
+ const start = id + 0;
+ const end = id + 1;
+ return {
+ start,
+ end,
+ nodes: {
+ [start]: {
+ direct: [],
+ transitions: {},
+ meta: {
+ op: "dollar",
+ to: end,
+ },
+ },
+ [end]: {
+ direct: [],
+ transitions: {},
+ },
+ },
+ };
+};
+
const OPERATORS_FNS = ({
zeroOrMoreFn = zeroOrMore,
oneOrMoreFn = oneOrMore,
@@ -717,6 +766,8 @@ const OPERATORS = OPERATORS_FNS();
const METACHARACTERS_FNS = {
"class": characterClass,
".": wildcard,
+ "^": caret,
+ "$": dollar,
};
const baseNFA = (token, id) => (