diff options
| author | EuAndreh <eu@euandre.org> | 2025-07-17 07:31:12 -0300 |
|---|---|---|
| committer | EuAndreh <eu@euandre.org> | 2025-07-17 07:31:12 -0300 |
| commit | 9434d30805576a7dbf4e2c8a5fb7da72089e6260 (patch) | |
| tree | ce7166a5950922ceeaa2bf9af6436fc4b6fa5499 /src/paca.mjs | |
| parent | Support searching in the NFA using the metacharacters. (diff) | |
| download | paca-9434d30805576a7dbf4e2c8a5fb7da72089e6260.tar.gz paca-9434d30805576a7dbf4e2c8a5fb7da72089e6260.tar.xz | |
Do away with the "nextID" attribute
Instead of being an increment over "end" that is carried along on NFA
transformation, now the id is computed directly as an increment on
"end". During this refactor, I even saw that "end" and "nextID" of
`concat()` are computed differently, despite arriving at the same
result: "end" is rhs.end, while "nextID" is the max of the nextID from
lhs and rhs.
Diffstat (limited to 'src/paca.mjs')
| -rw-r--r-- | src/paca.mjs | 27 |
1 files changed, 6 insertions, 21 deletions
diff --git a/src/paca.mjs b/src/paca.mjs index 216dc2e..12eb4b9 100644 --- a/src/paca.mjs +++ b/src/paca.mjs @@ -480,11 +480,9 @@ const toPostfix = tokens => { const emptyNFA = () => { const startID = 1; const endID = 2; - const nextID = 3; return { start: startID, end: endID, - nextID, nodes: { [startID]: { direct: [ endID ], @@ -501,11 +499,9 @@ const emptyNFA = () => { const literal = (edge, id) => { const startID = id + 0; const endID = id + 1; - const nextID = id + 2; return { start: startID, end: endID, - nextID, nodes: { [startID]: { direct: [], @@ -524,7 +520,6 @@ const literal = (edge, id) => { const concat = (lhs, rhs) => ({ start: lhs.start, end: rhs.end, - nextID: max(lhs.nextID, rhs.nextID), nodes: { ...lhs.nodes, ...rhs.nodes, @@ -536,13 +531,11 @@ const concat = (lhs, rhs) => ({ }); const union = (lhs, rhs) => { - const startID = max(lhs.nextID, rhs.nextID); + const startID = max(lhs.end, rhs.end) + 1; const endID = startID + 1; - const nextID = startID + 2; return { start: startID, end: endID, - nextID, nodes: { ...lhs.nodes, ...rhs.nodes, @@ -567,13 +560,11 @@ const union = (lhs, rhs) => { }; const zeroOrMore = nfa => { - const startID = nfa.nextID; - const endID = startID + 1; - const nextID = startID + 2; + const startID = nfa.end + 1; + const endID = nfa.end + 2; return { start: startID, end: endID, - nextID, nodes: { ...nfa.nodes, [nfa.end]: { @@ -598,13 +589,11 @@ const oneOrMore = nfa => concat(nfa, zeroOrMore(nfa)); const zeroOrOne = nfa => { - const startID = nfa.nextID; - const endID = startID + 1; - const nextID = startID + 2; + const startID = nfa.end + 1; + const endID = nfa.end + 2; return { start: startID, end: endID, - nextID, nodes: { ...nfa.nodes, [nfa.end]: { @@ -650,7 +639,6 @@ const inRange = (ranges, char) => { const characterClass = ({ set, caret }, id) => { const start = id + 0; const end = id + 1; - const nextID = id + 2; const { string, object } = Object.groupBy(set, x => typeof x); const ranges = Object.fromEntries( compressCharacterRanges((object || []).map( @@ -665,7 +653,6 @@ const characterClass = ({ set, caret }, id) => { return { start, end, - nextID, nodes: { [start]: { direct: [], @@ -688,11 +675,9 @@ const characterClass = ({ set, caret }, id) => { const wildcard = (_edge, id) => { const start = id + 0; const end = id + 1; - const nextID = id + 2; return { start, end, - nextID, nodes: { [start]: { direct: [], @@ -744,7 +729,7 @@ const baseNFA = (token, id) => ( const buildNFAStep = (stack, token) => !token.operator - ? stack.concat(baseNFA(token, last(stack)?.nextID || 1)) + ? stack.concat(baseNFA(token, (last(stack)?.end || 0) + 1)) : OPERATORS[token.operator](stack); const buildNFA = tokens => |
