From 846adfdbb0931b9bda93cf38383103b44d7bd62b Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sun, 20 Jul 2025 09:31:16 -0300 Subject: Add initial support for caret and dollar metacharacters --- src/paca.mjs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'src') 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) => ( -- cgit v1.2.3