12345678910111213141516171819202122232425262728293031 |
- import {assertNever} from "../utils";
- import {Expression} from "./types";
- export function evaluate(expr: Expression): number {
- switch (expr.type) {
- case "literal": {
- return expr.value;
- }
- case "binary": {
- switch (expr.operator) {
- case "+":
- return evaluate(expr.left) + evaluate(expr.right);
- case "-":
- return evaluate(expr.left) - evaluate(expr.right);
- case "*":
- return evaluate(expr.left) * evaluate(expr.right);
- case "/":
- return evaluate(expr.left) / evaluate(expr.right);
- /* istanbul ignore next */
- default: {
- return assertNever("Unexpected binary operator", expr.operator);
- }
- }
- }
- /* istanbul ignore next */
- default: {
- return assertNever("Unexpected expression type", expr);
- }
- }
- }
|