compiler.ts: normalizeOptionValue now rejects NaN numbers and empty
strings. Previously typeof NaN === 'number' passed through and
propagated into option values, causing predicate comparisons like
value >= NaN to produce silent wrong results.
grammar.ts: parseAssertion now emits console.warn when silently
skipping unexpected tokens or failed clauses. Previously these
returns-null were invisible to developers.
454 solver+DSL + 57 E2E tests pass.
- grammar.ts: add 'between' to isKeywordThatCanBePredicate() so the parser
recognizes it as a valid predicate keyword in forall/exists formula bodies
- compiler.ts: add special case in compileDenseFOLToFormula for
between(, min, max, dimension?) that extracts numeric args into
options ({min, max, dimension}) instead of dropping them in the generic
arg loop. The existing betweenPredicate evaluator already handles these.
- fol-dense-combinations.test.ts: replace GAP test with two verified-working
tests for between and between with dimension
- Add leftAlignedWith/rightAlignedWith/topAlignedWith/bottomAlignedWith
to lexer TokenKind union and keyword map
- Add to grammar.ts consumeRelation() recognized relation kinds
- Dense DSL users can now write: '.a' leftAlignedWith '.b', etc.
(previously returned parser error 'Expected relation')