Skip to content

PrecedenceParser

Defined in: packages/engine/src/parser/PrecedenceParser.ts:41

── Hybrid Precedence Climbing Parser ─────────────────────────────────────────

Two-tier dispatch strategy:

Tier 1 (Fast Path): Inline switch on token.typeId for built-in operators. - Prefix: NUMBER, IDENT, LPAREN, MINUS, PLUS, STRING - Infix: checked via static BP_TABLE (Uint8Array indexed by typeId) - No Map.get(), no parselet function call overhead for ~95% of tokens

Tier 2 (Plugin Path): ParseletRegistry fallback for custom/plugin tokens. - Prefix: Map.get(tokenTypeId) for PrefixParselet - Infix: Map.get(tokenTypeId) for InfixParselet - Full flexibility for custom syntax

The parser emits directly to a BytecodeBuilder, no AST intermediate. Implements the same public API as the legacy Parser class so existing parselets continue to work without modification.

new PrecedenceParser(
parseletRegistry,
maxDepth?,
localeCode?): PrecedenceParser;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:110

ParameterTypeDefault value
parseletRegistryParseletRegistryundefined
maxDepthnumber50
localeCodestring"en"

PrecedenceParser

readonly static BP_TABLE: Uint8Array;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:62

Static binding power table, built once at module load, shared across all instances. Index = tokenTypeId, value = binding power (0 = not a built-in infix).

consume(expectedType?): Token;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:784

ParameterType
expectedType?string

Token


getLocaleCode(): string;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:117

Get locale code for NumberParselet to normalize separators

string


load(tokens, hasParens?): void;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:135

Load tokens for parsing. Identical to Parser.load().

ParameterTypeDescription
tokensToken[]-
hasParens?booleanif false, skips the O(n) paren balance scan (~90% of expressions)

void


match(expectedType): boolean;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:806

ParameterType
expectedTypestring

boolean


parseExpression(minBp?, _builder?): void;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:205

Parse a full expression starting at the current token position.

ParameterTypeDefault valueDescription
minBpnumber0minimum binding power (precedence climbing threshold). For left-associative operators, the recursive call uses bp + 1. For right-associative operators (^), it uses bp - 1.
_builder?BytecodeBuilderundefinedaccepted for parselet API compatibility; always uses this.builder.

void


peek(): Token | undefined;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:815

Token | undefined


peekAt(offset): Token | undefined;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:826

Read-only lookahead offset tokens past the current position, without consuming anything, peekAt(0) is equivalent to peek. this.tokens is a plain in-memory array (not a stream), so this is a simple, safe index read; no rewind/checkpoint mechanism is needed since nothing is consumed.

ParameterType
offsetnumber

Token | undefined


previous(): Token | undefined;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:830

Token | undefined


setBuilder(builder): void;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:843

Set the builder to use for the current parse. Called by ExpressionEngine.

ParameterType
builderBytecodeBuilder

void


setDiagnosticPipeline(pipeline, expression): void;

Defined in: packages/engine/src/parser/PrecedenceParser.ts:125

Set the diagnostic pipeline for parselet matching events. Cleared after each non-cached parse to avoid holding refs.

ParameterType
pipelineDiagnosticPipeline | undefined
expressionstring

void