Skip to content

fix: parallel selection mirrors Ruby Rule#max_length - #10

Merged
ronaldtse merged 1 commit into
mainfrom
fix/parallel-selection-max-length
Oct 1, 2026
Merged

ronaldtse merged 1 commit into
mainfrom
fix/parallel-selection-max-length

Conversation

@ronaldtse

Copy link
Copy Markdown
Contributor

The parallel alternation ordered rules by the length of the regex source string, so a boundary-guarded rule (\b + char renders longer than it matches) shadowed genuinely longer plain matches. This reproduces the Ruby runtime's exact selection key, measured against its parsed documents rather than inferred: Rule::Sub#max_length = from + before + after + not_before + not_after (+ priority), with zero-width stdlib aliases counting 1.

Through the Ruby bridge against the ISC corpus: alalc-ara-Arab-Latn-1997 goes 16 failures → 10 — the word-initial hamza class (أوج → "awj"), ta-marbuta h/t (ṣūrah/ṣalāh), and long-vowel classes all heal. The remaining 10 are per-rule fine-tuning (medial hamza carriers, mas'alah-class), not selection-order.

Py test suite: my two new selection tests pass; the 5 remaining failures are the pre-existing maps-path environment set (unchanged baseline).

The alternation ordered rules by regex-source-string length — a
boundary-guarded rule (\b + char = 3+ source chars) shadowed a
longer plain match. The Ruby runtime's key is from + before + after +
not_before + not_after (+ priority), zero-width stdlib aliases
counting 1. Measured against the Ruby parse of alalc-ara directly.

Through the Ruby bridge, alalc-ara-Arab-Latn-1997: 16 failures -> 10
(word-initial hamza, ta-marbuta h/t, long-vowel classes all heal).
@ronaldtse
ronaldtse merged commit 9180772 into main Oct 1, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant