impl modulo (handle negative divisors how people expect)
This commit is contained in:
parent
2b6aff0dab
commit
ce991fd12a
2 changed files with 7 additions and 0 deletions
|
@ -11,6 +11,11 @@ describe("expr", () => {
|
||||||
["1 * 2", "2"],
|
["1 * 2", "2"],
|
||||||
["1 / 2", "0.5"],
|
["1 / 2", "0.5"],
|
||||||
["1 // 2", "0"],
|
["1 // 2", "0"],
|
||||||
|
["1 % 2", "1"],
|
||||||
|
["3 % 2", "1"],
|
||||||
|
["-1 % 2", "1"],
|
||||||
|
// TODO: might change this! negative dividend is weird no matter what, but positive modulo is arguably the better call?
|
||||||
|
["1 % -2", "-1"],
|
||||||
// TODO: operator precedence
|
// TODO: operator precedence
|
||||||
// TODO: parentheses
|
// TODO: parentheses
|
||||||
])("%s", (expression, result) => {
|
])("%s", (expression, result) => {
|
||||||
|
|
|
@ -32,6 +32,7 @@ const MINUS_TOKEN = /\s*(\-)/y;
|
||||||
const TIMES_TOKEN = /\s*(\*)/y;
|
const TIMES_TOKEN = /\s*(\*)/y;
|
||||||
const FLOOR_TOKEN = /\s*(\/\/)/y;
|
const FLOOR_TOKEN = /\s*(\/\/)/y;
|
||||||
const DIV_TOKEN = /\s*(\/)/y;
|
const DIV_TOKEN = /\s*(\/)/y;
|
||||||
|
const MOD_TOKEN = /\s*(\%)/y;
|
||||||
|
|
||||||
const NUMBER_TOKEN = /\s*(\d+)/y;
|
const NUMBER_TOKEN = /\s*(\d+)/y;
|
||||||
|
|
||||||
|
@ -84,6 +85,7 @@ const Operators: TokenHandler[] = [
|
||||||
makeInfixOp(TIMES_TOKEN, 20, 21, (left, right) => ({ value: left * right })),
|
makeInfixOp(TIMES_TOKEN, 20, 21, (left, right) => ({ value: left * right })),
|
||||||
makeInfixOp(FLOOR_TOKEN, 20, 21, (left, right) => ({ value: Math.floor(left / right) })),
|
makeInfixOp(FLOOR_TOKEN, 20, 21, (left, right) => ({ value: Math.floor(left / right) })),
|
||||||
makeInfixOp(DIV_TOKEN, 20, 21, (left, right) => ({ value: left / right })),
|
makeInfixOp(DIV_TOKEN, 20, 21, (left, right) => ({ value: left / right })),
|
||||||
|
makeInfixOp(MOD_TOKEN, 20, 21, (left, right) => ({ value: ((left % right) + right) % right })),
|
||||||
];
|
];
|
||||||
|
|
||||||
const ZERO = { value: 0 };
|
const ZERO = { value: 0 };
|
||||||
|
|
Loading…
Reference in a new issue