From 5a34b0f6f7b5a0b6a9a77a8166cb3a3752499b0d Mon Sep 17 00:00:00 2001 From: Tangent Wantwight Date: Sat, 18 May 2024 21:33:17 -0400 Subject: [PATCH] Factor out common infix op logic --- src/lib/expr.ts | 46 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/lib/expr.ts b/src/lib/expr.ts index c0d1e96..4af04a1 100644 --- a/src/lib/expr.ts +++ b/src/lib/expr.ts @@ -58,44 +58,26 @@ function map( } } +function makeInfixOp(token:RegExp, leftBindingPower: number,rightBindingPower: number, op: (left: number, right: number) => Value | ErrorResult):TokenHandler { + return { + leftBindingPower, + token, + parse: ({ value: left }, matched, parser) => + map(parser.parseSubExpression(rightBindingPower), (right) => op(left, right)), + } +} + const Operators: TokenHandler[] = [ { leftBindingPower: -1, token: NUMBER_TOKEN, parse: (left, matched) => ({ value: Number(matched) }), }, - { - leftBindingPower: 10, - token: PLUS_TOKEN, - parse: ({ value: left }, matched, parser) => - map(parser.parseSubExpression(11), (right) => ({ value: left + right })), - }, - { - leftBindingPower: 10, - token: MINUS_TOKEN, - parse: ({ value: left }, matched, parser) => - map(parser.parseSubExpression(11), (right) => ({ value: left - right })), - }, - { - leftBindingPower: 20, - token: TIMES_TOKEN, - parse: ({ value: left }, matched, parser) => - map(parser.parseSubExpression(21), (right) => ({ value: left * right })), - }, - { - leftBindingPower: 20, - token: FLOOR_TOKEN, - parse: ({ value: left }, matched, parser) => - map(parser.parseSubExpression(21), (right) => ({ - value: Math.floor(left / right), - })), - }, - { - leftBindingPower: 20, - token: DIV_TOKEN, - parse: ({ value: left }, matched, parser) => - map(parser.parseSubExpression(21), (right) => ({ value: left / right })), - }, + makeInfixOp(PLUS_TOKEN, 10, 11, (left, right) => ({ value: left + right })), + makeInfixOp(MINUS_TOKEN, 10, 11, (left, right) => ({ value: left - right })), + makeInfixOp(TIMES_TOKEN, 10, 11, (left, right) => ({ value: left * right })), + makeInfixOp(FLOOR_TOKEN, 10, 11, (left, right) => ({ value: Math.floor(left / right) })), + makeInfixOp(DIV_TOKEN, 10, 11, (left, right) => ({ value: left / right })), ]; const ZERO = { value: 0 };