From 1e80c550115e6aa20a59479194e51976d74ef11d Mon Sep 17 00:00:00 2001 From: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:36:05 +0300 Subject: [PATCH] Refactor parseLine logic in src/engine/parser.ts (#100) Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- src/engine/parser.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/engine/parser.ts b/src/engine/parser.ts index 5287aef..80c61e7 100644 --- a/src/engine/parser.ts +++ b/src/engine/parser.ts @@ -62,6 +62,18 @@ export function parseLine(tokens: Token[], knownVars: Set, line: string) } } + const filtered = filterNoiseTokens(toks, knownVars); + + const goalSeek = tryParseGoalSeek(filtered, knownVars); + if (goalSeek) { + return { expr: goalSeek }; + } + + const p = new Parser(filtered, knownVars); + return { assign, expr: p.parseSeq() }; +} + +function filterNoiseTokens(toks: Token[], knownVars: Set): Token[] { // Noise filtering: drop junk and unknown words, but keep words that follow // a conversion operator (potential timezone names). const filtered: Token[] = []; @@ -81,7 +93,10 @@ export function parseLine(tokens: Token[], knownVars: Set, line: string) afterConv = tk.t === "conv"; filtered.push(tk); } + return filtered; +} +function tryParseGoalSeek(filtered: Token[], knownVars: Set): Node | null { // Goal seek: `? * 1.2 = 1000` → find x where lhs(x) = rhs(x) const hasUnknown = filtered.some((tk) => tk.t === "unknown"); if (hasUnknown) { @@ -89,12 +104,10 @@ export function parseLine(tokens: Token[], knownVars: Set, line: string) if (assignIdx >= 0) { const lhs = new Parser(filtered.slice(0, assignIdx), knownVars).parseSeq(); const rhs = new Parser(filtered.slice(assignIdx + 1), knownVars).parseSeq(); - if (lhs && rhs) return { expr: { k: "goalseek", lhs, rhs } }; + if (lhs && rhs) return { k: "goalseek", lhs, rhs }; } } - - const p = new Parser(filtered, knownVars); - return { assign, expr: p.parseSeq() }; + return null; }