@danielsimonjr/mathts-expression
v0.12.2
Published
Expression parser and evaluator for MathTS
Maintainers
Readme
@danielsimonjr/mathts-expression
Expression parser & evaluator for MathTS. The package root also re-exports the MathNode and StringOptions types used by scalarToNode / scalarToTex in @danielsimonjr/mathts-functions.
The expression engine for MathTS: a parser (string → AST), an AST node set, a compiler, and an evaluator. Includes a sandbox (getSafeProperty / getSafeMethod) for safe property access.
Limits on untrusted strings: max length 1,000,000 characters, max parenthesis nesting 125 (and 500 nested unary, power, assignment or conditional rules), max compile depth 512, which evaluate also applies before validation (see expression/tests/security/limits.test.ts and docs/api/expression.md).
Install
npm install @danielsimonjr/mathts-expressionWhat it provides
createParse/createParserClass/createParser— parse to an AST.- 16 AST node constructors (
createConstantNode,createOperatorNode, …). compile/createEvaluate/compileExpression— evaluate expressions.createScalarBuilder— build a scalar node tree (number,symbol,op,call,from).lnlowers to naturallogandloglowers tolog10. A formula string is rejected. Evaluate withevaluateScalarfrom@danielsimonjr/mathts-functions.scalarCanonical/scalarCanonicalKey/scalarSize/scalarDepth/scalarComplexity/scalarSymbols— structural toolkit for an existingScalarNode. The canonical key flattens+and*, rewrites-and/, and does not fold2^3to8.enumerateScalars/scalarGrammarAccepts— deterministic size-ordered enumeration of scalar trees from a grammar, with deduplication byscalarCanonicalKey. It is a generator that returns anEnumerationStopreason (exhausted-space,candidate-limit,time-limit,cancelled).budget.maxCandidates,budget.maxWallClockMs, and anAbortSignalend it; the wall clock and the signal are checked every 128 candidates considered, so a grammar that yields few trees still stops promptly.
import { createScalarBuilder, scalarEquals } from '@danielsimonjr/mathts-expression';
const b = createScalarBuilder();
const aa = b.op('*', [b.symbol('a'), b.symbol('a')]);
const aSquared = b.op('^', [b.symbol('a'), b.number(2)]);
console.log(scalarEquals(aa, aSquared)); // truegetStringSubset/setStringSubset— string indexing used by accessor/assign and by functionssubset(the barrel is the only public entry).- AST serializers on every node:
toString(),toTex()(LaTeX),toHTML(), andtoMathML()(MathML). - Focused re-exports are also published:
@danielsimonjr/mathts-{parser,ast,evaluator}.
Serializing an AST
Every node serializes to several formats. toMathML() returns a MathML
fragment (like toTex() returns a LaTeX fragment, without delimiters);
wrap it in a <math> element with mathMLDocument(node) to render. MathML is
typeset natively by modern browsers — no external dependencies.
import { mathMLDocument, mathMLError } from '@danielsimonjr/mathts-expression';
const node = parse('c = 1 / sqrt(eps0 * mu0)'); // parse from the functions package
node.toString(); // 'c = 1 / sqrt(eps0 * mu0)'
node.toTex(); // ' c=\\frac{1}{\\sqrt{ eps0\\cdot mu0}}'
node.toMathML(); // '<mrow><mi>c</mi><mo>=</mo><mfrac>…</mfrac></mrow>'
mathMLDocument(node); // '<math xmlns="…" display="block">…</math>' (renderable)mathMLError(src) produces a <math><merror> element for a parse failure.
License
MIT (c) Daniel Simon Jr.
