diff --git a/src/lib/expr.test.ts b/src/lib/expr.test.ts index 3b7b4ce..31b4714 100644 --- a/src/lib/expr.test.ts +++ b/src/lib/expr.test.ts @@ -5,10 +5,10 @@ describe("expr", () => { test.each([ ["1", "1"], ["1 + 2", "3"], - // ["1 - 2", "-1"], - // ["1 * 2", "2"], - // ["1 / 2", "0.5"], - // ["1 // 2", "0"], + ["1 - 2", "-1"], + ["1 * 2", "2"], + ["1 / 2", "0.5"], + ["1 // 2", "0"], // TODO: operator precedence // TODO: parentheses // TODO; eror reporting diff --git a/src/lib/expr.ts b/src/lib/expr.ts index 9926251..880ee2a 100644 --- a/src/lib/expr.ts +++ b/src/lib/expr.ts @@ -66,6 +66,32 @@ const Operators: TokenHandler[] = [ 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(11), (right) => ({ value: left * right })), + }, + { + leftBindingPower: 20, + token: FLOOR_TOKEN, + parse: ({ value: left }, matched, parser) => + map(parser.parseSubExpression(11), (right) => ({ + value: Math.floor(left / right), + })), + }, + { + leftBindingPower: 20, + token: DIV_TOKEN, + parse: ({ value: left }, matched, parser) => + map(parser.parseSubExpression(11), (right) => ({ value: left / right })), + }, ]; const ZERO = { value: 0 };