diff options
| author | EuAndreh <eu@euandre.org> | 2025-07-20 09:31:16 -0300 |
|---|---|---|
| committer | EuAndreh <eu@euandre.org> | 2025-07-20 09:31:16 -0300 |
| commit | 846adfdbb0931b9bda93cf38383103b44d7bd62b (patch) | |
| tree | 5b321562a45af19f713bac31fcbea3cac35ffa26 /src/paca.mjs | |
| parent | .gitignore: Remove trailing slash from node_modules rule (diff) | |
| download | paca-846adfdbb0931b9bda93cf38383103b44d7bd62b.tar.gz paca-846adfdbb0931b9bda93cf38383103b44d7bd62b.tar.xz | |
Add initial support for caret and dollar metacharacters
Diffstat (limited to 'src/paca.mjs')
| -rw-r--r-- | src/paca.mjs | 59 |
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) => ( |
