@flomsstaar/expression-tree 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/build/example.d.ts +1 -0
- package/build/example.js +18 -0
- package/build/index.d.ts +16 -0
- package/build/index.js +16 -0
- package/build/src/enums/binary_node_operator.d.ts +7 -0
- package/build/src/enums/binary_node_operator.js +8 -0
- package/build/src/enums/node_type.d.ts +6 -0
- package/build/src/enums/node_type.js +7 -0
- package/build/src/enums/unary_node_operator.d.ts +5 -0
- package/build/src/enums/unary_node_operator.js +6 -0
- package/build/src/errors/division_by_zero_error.d.ts +3 -0
- package/build/src/errors/division_by_zero_error.js +6 -0
- package/build/src/errors/invalid_expression_error.d.ts +3 -0
- package/build/src/errors/invalid_expression_error.js +6 -0
- package/build/src/errors/invalid_number_error.d.ts +4 -0
- package/build/src/errors/invalid_number_error.js +8 -0
- package/build/src/errors/invalid_square_root_error.d.ts +3 -0
- package/build/src/errors/invalid_square_root_error.js +6 -0
- package/build/src/errors/missing_parenthese_error.d.ts +3 -0
- package/build/src/errors/missing_parenthese_error.js +6 -0
- package/build/src/errors/unknown_binary_operator_error.d.ts +3 -0
- package/build/src/errors/unknown_binary_operator_error.js +6 -0
- package/build/src/errors/unknown_node_type_error.d.ts +3 -0
- package/build/src/errors/unknown_node_type_error.js +6 -0
- package/build/src/errors/unknown_unary_operator_error.d.ts +3 -0
- package/build/src/errors/unknown_unary_operator_error.js +6 -0
- package/build/src/expression_cutter.d.ts +4 -0
- package/build/src/expression_cutter.js +7 -0
- package/build/src/expression_evaluator.d.ts +10 -0
- package/build/src/expression_evaluator.js +74 -0
- package/build/src/expression_parser.d.ts +14 -0
- package/build/src/expression_parser.js +94 -0
- package/build/src/expression_tree.d.ts +10 -0
- package/build/src/expression_tree.js +18 -0
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +1 -0
- package/build/src/models/base_node.d.ts +5 -0
- package/build/src/models/base_node.js +6 -0
- package/build/src/models/binary_node.d.ts +8 -0
- package/build/src/models/binary_node.js +13 -0
- package/build/src/models/number_node.d.ts +6 -0
- package/build/src/models/number_node.js +12 -0
- package/build/src/models/unary_node.d.ts +7 -0
- package/build/src/models/unary_node.js +11 -0
- package/build/src/render_expression.d.ts +2 -0
- package/build/src/render_expression.js +56 -0
- package/build/tests/expression_cutter.test.d.ts +1 -0
- package/build/tests/expression_cutter.test.js +9 -0
- package/build/tests/expression_evaluator.test.d.ts +1 -0
- package/build/tests/expression_evaluator.test.js +110 -0
- package/build/tests/expression_parser.test.d.ts +1 -0
- package/build/tests/expression_parser.test.js +44 -0
- package/build/tests/expression_tree.test.d.ts +1 -0
- package/build/tests/expression_tree.test.js +12 -0
- package/build/tests/inputs/expression_cutter_input.d.ts +1 -0
- package/build/tests/inputs/expression_cutter_input.js +230 -0
- package/build/tests/inputs/expression_parser_input.d.ts +2 -0
- package/build/tests/inputs/expression_parser_input.js +197 -0
- package/build/tests/inputs/expression_tree_input.d.ts +1 -0
- package/build/tests/inputs/expression_tree_input.js +44 -0
- package/build/tests/number_node.test.d.ts +1 -0
- package/build/tests/number_node.test.js +16 -0
- package/build/tests/render_expression.test.d.ts +1 -0
- package/build/tests/render_expression.test.js +85 -0
- package/build/vitest.config.d.ts +2 -0
- package/build/vitest.config.js +10 -0
- package/package.json +47 -0
- package/src/enums/binary_node_operator.ts +7 -0
- package/src/enums/node_type.ts +6 -0
- package/src/enums/unary_node_operator.ts +5 -0
- package/src/errors/division_by_zero_error.ts +6 -0
- package/src/errors/invalid_expression_error.ts +6 -0
- package/src/errors/invalid_number_error.ts +6 -0
- package/src/errors/invalid_square_root_error.ts +6 -0
- package/src/errors/missing_parenthese_error.ts +6 -0
- package/src/errors/unknown_binary_operator_error.ts +6 -0
- package/src/errors/unknown_node_type_error.ts +6 -0
- package/src/errors/unknown_unary_operator_error.ts +6 -0
- package/src/expression_cutter.ts +9 -0
- package/src/expression_evaluator.ts +76 -0
- package/src/expression_parser.ts +117 -0
- package/src/expression_tree.ts +19 -0
- package/src/models/base_node.ts +5 -0
- package/src/models/binary_node.ts +13 -0
- package/src/models/number_node.ts +12 -0
- package/src/models/unary_node.ts +12 -0
- package/src/render_expression.ts +57 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { NumberNode } from './models/number_node.js';
|
|
2
|
+
import { BinaryNode } from './models/binary_node.js';
|
|
3
|
+
import { BinaryNodeOperator } from './enums/binary_node_operator.js';
|
|
4
|
+
import { UnknownBinaryOperatorError } from './errors/unknown_binary_operator_error.js';
|
|
5
|
+
import { UnaryNode } from './models/unary_node.js';
|
|
6
|
+
import { UnaryNodeOperator } from './enums/unary_node_operator.js';
|
|
7
|
+
import { UnknownUnaryOperatorError } from './errors/unknown_unary_operator_error.js';
|
|
8
|
+
import { UnknownNodeTypeError } from './errors/unknown_node_type_error.js';
|
|
9
|
+
export function renderExpression(node) {
|
|
10
|
+
if (node instanceof BinaryNode) {
|
|
11
|
+
const leftNode = renderExpression(node.left);
|
|
12
|
+
const rightNode = renderExpression(node.right);
|
|
13
|
+
const operator = {
|
|
14
|
+
[BinaryNodeOperator.SUM]: '+',
|
|
15
|
+
[BinaryNodeOperator.SUBTRACT]: '-',
|
|
16
|
+
[BinaryNodeOperator.MULTIPLY]: '*',
|
|
17
|
+
[BinaryNodeOperator.DIVIDE]: '/',
|
|
18
|
+
[BinaryNodeOperator.POWER]: '^',
|
|
19
|
+
}[node.operator];
|
|
20
|
+
if (!operator) {
|
|
21
|
+
throw new UnknownBinaryOperatorError(node.operator);
|
|
22
|
+
}
|
|
23
|
+
return `${leftNode} ${operator} ${rightNode}`;
|
|
24
|
+
}
|
|
25
|
+
else if (node instanceof UnaryNode) {
|
|
26
|
+
switch (node.operator) {
|
|
27
|
+
case UnaryNodeOperator.NEGATE: {
|
|
28
|
+
if (node.value instanceof NumberNode && node.value.value === 0) {
|
|
29
|
+
return '0';
|
|
30
|
+
}
|
|
31
|
+
else if (node.value instanceof BinaryNode) {
|
|
32
|
+
const valueNode = renderExpression(node.value);
|
|
33
|
+
return `-(${valueNode})`;
|
|
34
|
+
}
|
|
35
|
+
const valueNode = renderExpression(node.value);
|
|
36
|
+
return `-${valueNode}`;
|
|
37
|
+
}
|
|
38
|
+
case UnaryNodeOperator.ABSOLUTE: {
|
|
39
|
+
const valueNode = renderExpression(node.value);
|
|
40
|
+
return `abs(${valueNode})`;
|
|
41
|
+
}
|
|
42
|
+
case UnaryNodeOperator.SQUARE_ROOT: {
|
|
43
|
+
const valueNode = renderExpression(node.value);
|
|
44
|
+
return `sqrt(${valueNode})`;
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
throw new UnknownUnaryOperatorError(node.operator);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (node instanceof NumberNode) {
|
|
51
|
+
return node.toString();
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw new UnknownNodeTypeError(node.type);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { ExpressionCutter } from '../src/expression_cutter.js';
|
|
3
|
+
import { expressionCutterInput } from './inputs/expression_cutter_input.js';
|
|
4
|
+
describe('expression cutter', () => {
|
|
5
|
+
test.each(expressionCutterInput())('expression: %s', (input, expected) => {
|
|
6
|
+
const expressionCutter = new ExpressionCutter();
|
|
7
|
+
expect(expressionCutter.cut(input)).toStrictEqual(expected);
|
|
8
|
+
});
|
|
9
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, test } from 'vitest';
|
|
2
|
+
import { UnaryNode } from '../src/models/unary_node.js';
|
|
3
|
+
import { UnaryNodeOperator } from '../src/enums/unary_node_operator.js';
|
|
4
|
+
import { NumberNode } from '../src/models/number_node.js';
|
|
5
|
+
import { ExpressionEvaluator } from '../src/expression_evaluator.js';
|
|
6
|
+
import { BinaryNode } from '../src/models/binary_node.js';
|
|
7
|
+
import { BinaryNodeOperator } from '../src/enums/binary_node_operator.js';
|
|
8
|
+
import { NegativeSquareRootError } from '../src/errors/invalid_square_root_error.js';
|
|
9
|
+
import { DivisionByZeroError } from '../src/errors/division_by_zero_error.js';
|
|
10
|
+
import { UnknownUnaryOperatorError } from '../src/errors/unknown_unary_operator_error.js';
|
|
11
|
+
import { UnknownBinaryOperatorError } from '../src/errors/unknown_binary_operator_error.js';
|
|
12
|
+
import { UnknownNodeTypeError } from '../src/errors/unknown_node_type_error.js';
|
|
13
|
+
describe('evaluate expression', () => {
|
|
14
|
+
let evaluator;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
evaluator = new ExpressionEvaluator();
|
|
17
|
+
});
|
|
18
|
+
describe('unary node operations', () => {
|
|
19
|
+
describe('negation operation', () => {
|
|
20
|
+
it('should negate a number', () => {
|
|
21
|
+
const expression = new UnaryNode(UnaryNodeOperator.NEGATE, new NumberNode(5));
|
|
22
|
+
const result = evaluator.evaluate(expression);
|
|
23
|
+
expect(result).toBe(-5);
|
|
24
|
+
});
|
|
25
|
+
it('should negate an operation', () => {
|
|
26
|
+
const expression = new UnaryNode(UnaryNodeOperator.NEGATE, new BinaryNode(BinaryNodeOperator.SUM, new NumberNode(3), new NumberNode(2)));
|
|
27
|
+
const result = evaluator.evaluate(expression);
|
|
28
|
+
expect(result).toBe(-5);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('square root operation', () => {
|
|
32
|
+
it('should calculate square root of a positive number', () => {
|
|
33
|
+
const expression = new UnaryNode(UnaryNodeOperator.SQUARE_ROOT, new NumberNode(16));
|
|
34
|
+
const result = evaluator.evaluate(expression);
|
|
35
|
+
expect(result).toBe(4);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('absolute value operation', () => {
|
|
39
|
+
it('should return absolute value of a negative number', () => {
|
|
40
|
+
const expression = new UnaryNode(UnaryNodeOperator.ABSOLUTE, new NumberNode(-10));
|
|
41
|
+
const result = evaluator.evaluate(expression);
|
|
42
|
+
expect(result).toBe(10);
|
|
43
|
+
});
|
|
44
|
+
it('should return absolute value of a positive number', () => {
|
|
45
|
+
const expression = new UnaryNode(UnaryNodeOperator.ABSOLUTE, new NumberNode(10));
|
|
46
|
+
const result = evaluator.evaluate(expression);
|
|
47
|
+
expect(result).toBe(10);
|
|
48
|
+
});
|
|
49
|
+
it('should return absolute value of zero', () => {
|
|
50
|
+
const expression = new UnaryNode(UnaryNodeOperator.ABSOLUTE, new NumberNode(0));
|
|
51
|
+
const result = evaluator.evaluate(expression);
|
|
52
|
+
expect(result).toBe(0);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('binary node operations', () => {
|
|
57
|
+
test('sum operation', () => {
|
|
58
|
+
const expression = new BinaryNode(BinaryNodeOperator.SUM, new NumberNode(2), new NumberNode(2));
|
|
59
|
+
const result = evaluator.evaluate(expression);
|
|
60
|
+
expect(result).toBe(4);
|
|
61
|
+
});
|
|
62
|
+
test('subtract operation', () => {
|
|
63
|
+
const expression = new BinaryNode(BinaryNodeOperator.SUBTRACT, new NumberNode(5), new NumberNode(3));
|
|
64
|
+
const result = evaluator.evaluate(expression);
|
|
65
|
+
expect(result).toBe(2);
|
|
66
|
+
});
|
|
67
|
+
test('multiply operation', () => {
|
|
68
|
+
const expression = new BinaryNode(BinaryNodeOperator.MULTIPLY, new NumberNode(3), new NumberNode(4));
|
|
69
|
+
const result = evaluator.evaluate(expression);
|
|
70
|
+
expect(result).toBe(12);
|
|
71
|
+
});
|
|
72
|
+
test('divide operation', () => {
|
|
73
|
+
const expression = new BinaryNode(BinaryNodeOperator.DIVIDE, new NumberNode(8), new NumberNode(2));
|
|
74
|
+
const result = evaluator.evaluate(expression);
|
|
75
|
+
expect(result).toBe(4);
|
|
76
|
+
});
|
|
77
|
+
test('power operation', () => {
|
|
78
|
+
const expression = new BinaryNode(BinaryNodeOperator.POWER, new NumberNode(8), new NumberNode(2));
|
|
79
|
+
const result = evaluator.evaluate(expression);
|
|
80
|
+
expect(result).toBe(64);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('unsupported operations', () => {
|
|
84
|
+
test('unknown unary operator', () => {
|
|
85
|
+
const expression = new UnaryNode('UNKNOWN_UNARY_OPERATOR', new NumberNode(1));
|
|
86
|
+
expect(() => evaluator.evaluate(expression)).toThrowError(UnknownUnaryOperatorError);
|
|
87
|
+
});
|
|
88
|
+
test('unknown binary operator', () => {
|
|
89
|
+
const expression = new BinaryNode('UNKNOWN_OPERATOR', new NumberNode(1), new NumberNode(2));
|
|
90
|
+
expect(() => evaluator.evaluate(expression)).toThrowError(UnknownBinaryOperatorError);
|
|
91
|
+
});
|
|
92
|
+
test('unknown node type', () => {
|
|
93
|
+
const expression = {
|
|
94
|
+
type: 'UNKNOWN_NODE_TYPE',
|
|
95
|
+
value: 42,
|
|
96
|
+
};
|
|
97
|
+
expect(() => evaluator.evaluate(expression)).toThrowError(UnknownNodeTypeError);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('special cases', () => {
|
|
101
|
+
test('division by zero', () => {
|
|
102
|
+
const expression = new BinaryNode(BinaryNodeOperator.DIVIDE, new NumberNode(10), new NumberNode(0));
|
|
103
|
+
expect(() => evaluator.evaluate(expression)).toThrowError(DivisionByZeroError);
|
|
104
|
+
});
|
|
105
|
+
test('negative square root', () => {
|
|
106
|
+
const expression = new UnaryNode(UnaryNodeOperator.SQUARE_ROOT, new NumberNode(-4));
|
|
107
|
+
expect(() => evaluator.evaluate(expression)).toThrowError(NegativeSquareRootError);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { expressionParserInput } from './inputs/expression_parser_input.js';
|
|
3
|
+
import { ExpressionParser } from '../src/expression_parser.js';
|
|
4
|
+
import { InvalidExpressionError } from '../src/errors/invalid_expression_error.js';
|
|
5
|
+
import { UnknownBinaryOperatorError } from '../src/errors/unknown_binary_operator_error.js';
|
|
6
|
+
import { MissingClosingParenthesisError } from '../src/errors/missing_parenthese_error.js';
|
|
7
|
+
import { InvalidNumberError } from '../src/errors/invalid_number_error.js';
|
|
8
|
+
describe('expression parser', () => {
|
|
9
|
+
test.each(expressionParserInput())('expression: %o', (input, expected) => {
|
|
10
|
+
const parser = new ExpressionParser();
|
|
11
|
+
expect(parser.parse(input)).toStrictEqual(expected);
|
|
12
|
+
});
|
|
13
|
+
describe('error cases', () => {
|
|
14
|
+
test('should throw an error if the expression is not complete', () => {
|
|
15
|
+
const parser = new ExpressionParser();
|
|
16
|
+
expect(() => parser.parse(['6', '+'])).toThrowError(InvalidExpressionError);
|
|
17
|
+
});
|
|
18
|
+
test('should throw an error if the expression is empty', () => {
|
|
19
|
+
const parser = new ExpressionParser();
|
|
20
|
+
expect(() => parser.parse([])).toThrowError(InvalidExpressionError);
|
|
21
|
+
});
|
|
22
|
+
test('should throw an error if the expression is invalid', () => {
|
|
23
|
+
const parser = new ExpressionParser();
|
|
24
|
+
expect(() => parser.parse(['6', '+', '5', 'invalid'])).toThrowError(InvalidExpressionError);
|
|
25
|
+
});
|
|
26
|
+
test.each([[['6', '+', '65a']], [['6', '+', 'a65']], [['6', '+', '6a5']]])('should throw an error if the expression has invalid numbers', (input) => {
|
|
27
|
+
const parser = new ExpressionParser();
|
|
28
|
+
expect(() => parser.parse(input)).toThrowError(InvalidNumberError);
|
|
29
|
+
});
|
|
30
|
+
test('should throw an error if the expression has missing parentheses', () => {
|
|
31
|
+
const parser = new ExpressionParser();
|
|
32
|
+
expect(() => parser.parse(['(', '6', '+', '5', '5'])).toThrowError(MissingClosingParenthesisError);
|
|
33
|
+
});
|
|
34
|
+
test('should throw an error if the parser can not map an operator', () => {
|
|
35
|
+
class FakeExpressionParser extends ExpressionParser {
|
|
36
|
+
test() {
|
|
37
|
+
this.mapRowOperator('UNKNOWN_OPERATOR');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const parser = new FakeExpressionParser();
|
|
41
|
+
expect(() => parser.test()).toThrowError(UnknownBinaryOperatorError);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test } from 'vitest';
|
|
2
|
+
import { ExpressionTree } from '../src/expression_tree.js';
|
|
3
|
+
import { expressionTreeInput } from './inputs/expression_tree_input.js';
|
|
4
|
+
describe('expression tree', () => {
|
|
5
|
+
let expressionTree;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
expressionTree = new ExpressionTree();
|
|
8
|
+
});
|
|
9
|
+
test.each(expressionTreeInput())('expression: %s = %d', (expression, expectedResult) => {
|
|
10
|
+
expect(expressionTree.evaluate(expression)).toBe(expectedResult);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function expressionCutterInput(): [string, string[]][];
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export function expressionCutterInput() {
|
|
2
|
+
return [
|
|
3
|
+
// Addition
|
|
4
|
+
['6 + 5', ['6', '+', '5']],
|
|
5
|
+
['56 + 5', ['56', '+', '5']],
|
|
6
|
+
['56 + 15', ['56', '+', '15']],
|
|
7
|
+
['6 + 15', ['6', '+', '15']],
|
|
8
|
+
['6+5', ['6', '+', '5']],
|
|
9
|
+
['56+5', ['56', '+', '5']],
|
|
10
|
+
['56+15', ['56', '+', '15']],
|
|
11
|
+
['6+15', ['6', '+', '15']],
|
|
12
|
+
// Subtraction
|
|
13
|
+
['6 - 4', ['6', '-', '4']],
|
|
14
|
+
['61 - 4', ['61', '-', '4']],
|
|
15
|
+
['61 - 14', ['61', '-', '14']],
|
|
16
|
+
['6 - 14', ['6', '-', '14']],
|
|
17
|
+
['6-4', ['6', '-', '4']],
|
|
18
|
+
['61-4', ['61', '-', '4']],
|
|
19
|
+
['61-14', ['61', '-', '14']],
|
|
20
|
+
['6-14', ['6', '-', '14']],
|
|
21
|
+
// Multiplication
|
|
22
|
+
['6 * 3', ['6', '*', '3']],
|
|
23
|
+
['61 * 3', ['61', '*', '3']],
|
|
24
|
+
['61 * 15', ['61', '*', '15']],
|
|
25
|
+
['6 * 15', ['6', '*', '15']],
|
|
26
|
+
['6*3', ['6', '*', '3']],
|
|
27
|
+
['61*3', ['61', '*', '3']],
|
|
28
|
+
['61*15', ['61', '*', '15']],
|
|
29
|
+
['6*15', ['6', '*', '15']],
|
|
30
|
+
// Division
|
|
31
|
+
['6 / 2', ['6', '/', '2']],
|
|
32
|
+
['61 / 2', ['61', '/', '2']],
|
|
33
|
+
['61 / 15', ['61', '/', '15']],
|
|
34
|
+
['6 / 15', ['6', '/', '15']],
|
|
35
|
+
['6/2', ['6', '/', '2']],
|
|
36
|
+
['61/2', ['61', '/', '2']],
|
|
37
|
+
['61/15', ['61', '/', '15']],
|
|
38
|
+
['6/15', ['6', '/', '15']],
|
|
39
|
+
// Power
|
|
40
|
+
['6 ^ 2', ['6', '^', '2']],
|
|
41
|
+
['61 ^ 2', ['61', '^', '2']],
|
|
42
|
+
['61 ^ 15', ['61', '^', '15']],
|
|
43
|
+
['6 ^ 15', ['6', '^', '15']],
|
|
44
|
+
['6^2', ['6', '^', '2']],
|
|
45
|
+
['61^2', ['61', '^', '2']],
|
|
46
|
+
['61^15', ['61', '^', '15']],
|
|
47
|
+
['6^15', ['6', '^', '15']],
|
|
48
|
+
// Complex expressions
|
|
49
|
+
['6 + 5 - 4 * 3 / 2', ['6', '+', '5', '-', '4', '*', '3', '/', '2']],
|
|
50
|
+
['6 + 5 - 4 * 3 / 2 + 15', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15']],
|
|
51
|
+
['6 + 5 - 4 * 3 / 2 - 15', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15']],
|
|
52
|
+
['-6 + 5 - 4 * 3 / 2 + 15', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15']],
|
|
53
|
+
['-6 + 5 - 4 * 3 / 2 - 15', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15']],
|
|
54
|
+
[
|
|
55
|
+
'6 + 5 - 4 * 3 / 2 + 15 - 10',
|
|
56
|
+
['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '-', '10'],
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
'6 + 5 - 4 * 3 / 2 - 15 + 10',
|
|
60
|
+
['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '+', '10'],
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
'6 + 5 - 4 * 3 / 2 + 15 ^ 2',
|
|
64
|
+
['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '^', '2'],
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
'6 + 5 - 4 * 3 / 2 - 15 ^ 2',
|
|
68
|
+
['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '^', '2'],
|
|
69
|
+
],
|
|
70
|
+
[
|
|
71
|
+
'-6 + 5 - 4 * 3 / 2 + 15 ^ 2',
|
|
72
|
+
['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '^', '2'],
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
'-6 + 5 - 4 * 3 / 2 - 15 ^ 2',
|
|
76
|
+
['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '^', '2'],
|
|
77
|
+
],
|
|
78
|
+
['6+5-4*3/2', ['6', '+', '5', '-', '4', '*', '3', '/', '2']],
|
|
79
|
+
['6+5-4*3/2+15', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15']],
|
|
80
|
+
['6+5-4*3/2-15', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15']],
|
|
81
|
+
['-6+5-4*3/2+15', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15']],
|
|
82
|
+
['-6+5-4*3/2-15', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15']],
|
|
83
|
+
['6+5-4*3/2+15-10', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '-', '10']],
|
|
84
|
+
['6+5-4*3/2-15+10', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '+', '10']],
|
|
85
|
+
['6+5-4*3/2+15^2', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '^', '2']],
|
|
86
|
+
['6+5-4*3/2-15^2', ['6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '^', '2']],
|
|
87
|
+
['-6+5-4*3/2+15^2', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', '^', '2']],
|
|
88
|
+
['-6+5-4*3/2-15^2', ['-', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '^', '2']],
|
|
89
|
+
// Negative numbers
|
|
90
|
+
['-6 + 5', ['-', '6', '+', '5']],
|
|
91
|
+
['6 + -5', ['6', '+', '-', '5']],
|
|
92
|
+
['-65 + 4', ['-', '65', '+', '4']],
|
|
93
|
+
['6 + -45', ['6', '+', '-', '45']],
|
|
94
|
+
['-6 - 5', ['-', '6', '-', '5']],
|
|
95
|
+
['-65 - 4', ['-', '65', '-', '4']],
|
|
96
|
+
['-6 * 5', ['-', '6', '*', '5']],
|
|
97
|
+
['-65 * 4', ['-', '65', '*', '4']],
|
|
98
|
+
['-6 / 5', ['-', '6', '/', '5']],
|
|
99
|
+
['-65 / 4', ['-', '65', '/', '4']],
|
|
100
|
+
['6 ^ -2', ['6', '^', '-', '2']],
|
|
101
|
+
['-6 * -5 + 4 / -2', ['-', '6', '*', '-', '5', '+', '4', '/', '-', '2']],
|
|
102
|
+
['-6+5', ['-', '6', '+', '5']],
|
|
103
|
+
['6+-5', ['6', '+', '-', '5']],
|
|
104
|
+
['-65+4', ['-', '65', '+', '4']],
|
|
105
|
+
['6+-45', ['6', '+', '-', '45']],
|
|
106
|
+
['-6-5', ['-', '6', '-', '5']],
|
|
107
|
+
['-65-4', ['-', '65', '-', '4']],
|
|
108
|
+
['-6*5', ['-', '6', '*', '5']],
|
|
109
|
+
['-65*4', ['-', '65', '*', '4']],
|
|
110
|
+
['-6/5', ['-', '6', '/', '5']],
|
|
111
|
+
['-65/4', ['-', '65', '/', '4']],
|
|
112
|
+
['-6*-5+4/-2', ['-', '6', '*', '-', '5', '+', '4', '/', '-', '2']],
|
|
113
|
+
// Parentheses
|
|
114
|
+
['(3)', ['(', '3', ')']],
|
|
115
|
+
['-(3)', ['-', '(', '3', ')']],
|
|
116
|
+
['-(2+4)', ['-', '(', '2', '+', '4', ')']],
|
|
117
|
+
['-((1+2)*3)', ['-', '(', '(', '1', '+', '2', ')', '*', '3', ')']],
|
|
118
|
+
['5 + -(7-2)', ['5', '+', '-', '(', '7', '-', '2', ')']],
|
|
119
|
+
['--(8/2)', ['-', '-', '(', '8', '/', '2', ')']],
|
|
120
|
+
['(6)-(-3)', ['(', '6', ')', '-', '(', '-', '3', ')']],
|
|
121
|
+
['(6 + 5)', ['(', '6', '+', '5', ')']],
|
|
122
|
+
['(6 + 5) - 4', ['(', '6', '+', '5', ')', '-', '4']],
|
|
123
|
+
['(6 + 5) * 4', ['(', '6', '+', '5', ')', '*', '4']],
|
|
124
|
+
['(6 + 5) / 4', ['(', '6', '+', '5', ')', '/', '4']],
|
|
125
|
+
['-(6 + 5) / 4', ['-', '(', '6', '+', '5', ')', '/', '4']],
|
|
126
|
+
['(6 + 5) - (4 * 3)', ['(', '6', '+', '5', ')', '-', '(', '4', '*', '3', ')']],
|
|
127
|
+
['(6 + 5) - (4 * 3 / 2)', ['(', '6', '+', '5', ')', '-', '(', '4', '*', '3', '/', '2', ')']],
|
|
128
|
+
[
|
|
129
|
+
'((6 + 5) - (4 * 3)) / 2',
|
|
130
|
+
['(', '(', '6', '+', '5', ')', '-', '(', '4', '*', '3', ')', ')', '/', '2'],
|
|
131
|
+
],
|
|
132
|
+
['(56 + 5)', ['(', '56', '+', '5', ')']],
|
|
133
|
+
['(6 + 15)', ['(', '6', '+', '15', ')']],
|
|
134
|
+
['(61 - 4)', ['(', '61', '-', '4', ')']],
|
|
135
|
+
['(6 - 14)', ['(', '6', '-', '14', ')']],
|
|
136
|
+
['(6 * 3)', ['(', '6', '*', '3', ')']],
|
|
137
|
+
['(61 * 3)', ['(', '61', '*', '3', ')']],
|
|
138
|
+
['(61 / 2)', ['(', '61', '/', '2', ')']],
|
|
139
|
+
['(6 / 15)', ['(', '6', '/', '15', ')']],
|
|
140
|
+
['(6 ^ 2)', ['(', '6', '^', '2', ')']],
|
|
141
|
+
['(61 ^ 2)', ['(', '61', '^', '2', ')']],
|
|
142
|
+
['(61 ^ 15)', ['(', '61', '^', '15', ')']],
|
|
143
|
+
['(6 ^ 15)', ['(', '6', '^', '15', ')']],
|
|
144
|
+
['(6 + 5 - 4 * 3 / 2)', ['(', '6', '+', '5', '-', '4', '*', '3', '/', '2', ')']],
|
|
145
|
+
[
|
|
146
|
+
'(6 + 5 - 4 * 3 / 2 + 15)',
|
|
147
|
+
['(', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', ')'],
|
|
148
|
+
],
|
|
149
|
+
[
|
|
150
|
+
'(6 + 5 - 4 * 3 / 2 - 15)',
|
|
151
|
+
['(', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', ')'],
|
|
152
|
+
],
|
|
153
|
+
[
|
|
154
|
+
'-(6 + 5 - 4 * 3 / 2 + 15)',
|
|
155
|
+
['-', '(', '6', '+', '5', '-', '4', '*', '3', '/', '2', '+', '15', ')'],
|
|
156
|
+
],
|
|
157
|
+
[
|
|
158
|
+
'-(6 + 5 - 4 * 3 / 2 - 15)',
|
|
159
|
+
['-', '(', '6', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', ')'],
|
|
160
|
+
],
|
|
161
|
+
[
|
|
162
|
+
'(6 + 5 - 41 * 3 / 2 + 15 - 10)',
|
|
163
|
+
['(', '6', '+', '5', '-', '41', '*', '3', '/', '2', '+', '15', '-', '10', ')'],
|
|
164
|
+
],
|
|
165
|
+
[
|
|
166
|
+
'(65 + 5 - 4 * 3 / 2 - 15 + 10)',
|
|
167
|
+
['(', '65', '+', '5', '-', '4', '*', '3', '/', '2', '-', '15', '+', '10', ')'],
|
|
168
|
+
],
|
|
169
|
+
['(6 + 5) ^ 2', ['(', '6', '+', '5', ')', '^', '2']],
|
|
170
|
+
['(6 + 5) ^ 15', ['(', '6', '+', '5', ')', '^', '15']],
|
|
171
|
+
['(6 ^ 2 + 5)', ['(', '6', '^', '2', '+', '5', ')']],
|
|
172
|
+
['(6 + 5) ^ (4 * 3)', ['(', '6', '+', '5', ')', '^', '(', '4', '*', '3', ')']],
|
|
173
|
+
// Float numbers
|
|
174
|
+
['6.5 + 5.2', ['6.5', '+', '5.2']],
|
|
175
|
+
['-6.5 + 5.2', ['-', '6.5', '+', '5.2']],
|
|
176
|
+
['6.5 - 4.3', ['6.5', '-', '4.3']],
|
|
177
|
+
['-6.5 - 4.3', ['-', '6.5', '-', '4.3']],
|
|
178
|
+
['6.5 * 3.1', ['6.5', '*', '3.1']],
|
|
179
|
+
['-6.5 * 3.1', ['-', '6.5', '*', '3.1']],
|
|
180
|
+
['6.5 / 2.2', ['6.5', '/', '2.2']],
|
|
181
|
+
['-6.5 / 2.2', ['-', '6.5', '/', '2.2']],
|
|
182
|
+
['6.5 + 5.2 - 4.3 * 3.1 / 2.2', ['6.5', '+', '5.2', '-', '4.3', '*', '3.1', '/', '2.2']],
|
|
183
|
+
[
|
|
184
|
+
'6.5 + 5.2 - 4.3 * 3.1 / 2.2 + 15.0',
|
|
185
|
+
['6.5', '+', '5.2', '-', '4.3', '*', '3.1', '/', '2.2', '+', '15.0'],
|
|
186
|
+
],
|
|
187
|
+
[
|
|
188
|
+
'6.5 + 5.2 - 4.3 * 3.1 / 2.2 - 15.0',
|
|
189
|
+
['6.5', '+', '5.2', '-', '4.3', '*', '3.1', '/', '2.2', '-', '15.0'],
|
|
190
|
+
],
|
|
191
|
+
[
|
|
192
|
+
'-6.5 + 5.2 - 4.3 * 3.1 / 2.2 + 15',
|
|
193
|
+
['-', '6.5', '+', '5.2', '-', '4.3', '*', '3.1', '/', '2.2', '+', '15'],
|
|
194
|
+
],
|
|
195
|
+
[
|
|
196
|
+
'-6.5 + 5.2 - 4.3 * 3.1 / 2.2 - 15',
|
|
197
|
+
['-', '6.5', '+', '5.2', '-', '4.3', '*', '3.1', '/', '2.2', '-', '15'],
|
|
198
|
+
],
|
|
199
|
+
// Square root
|
|
200
|
+
['sqrt(4)', ['sqrt', '(', '4', ')']],
|
|
201
|
+
['sqrt(16 + 9)', ['sqrt', '(', '16', '+', '9', ')']],
|
|
202
|
+
['sqrt(25) + 3', ['sqrt', '(', '25', ')', '+', '3']],
|
|
203
|
+
['3 + sqrt(36)', ['3', '+', 'sqrt', '(', '36', ')']],
|
|
204
|
+
['sqrt(49) - 2', ['sqrt', '(', '49', ')', '-', '2']],
|
|
205
|
+
['-sqrt(64)', ['-', 'sqrt', '(', '64', ')']],
|
|
206
|
+
['sqrt(81) * 2', ['sqrt', '(', '81', ')', '*', '2']],
|
|
207
|
+
['-3 + sqrt(100)', ['-', '3', '+', 'sqrt', '(', '100', ')']],
|
|
208
|
+
// Absolute value
|
|
209
|
+
['abs(5)', ['abs', '(', '5', ')']],
|
|
210
|
+
['abs(-5)', ['abs', '(', '-', '5', ')']],
|
|
211
|
+
['abs(3 - 7)', ['abs', '(', '3', '-', '7', ')']],
|
|
212
|
+
['abs(-3 + 7)', ['abs', '(', '-', '3', '+', '7', ')']],
|
|
213
|
+
['-abs(4)', ['-', 'abs', '(', '4', ')']],
|
|
214
|
+
['abs(6 * -2)', ['abs', '(', '6', '*', '-', '2', ')']],
|
|
215
|
+
['-abs(-8 / 2)', ['-', 'abs', '(', '-', '8', '/', '2', ')']],
|
|
216
|
+
['abs(9 + 1)', ['abs', '(', '9', '+', '1', ')']],
|
|
217
|
+
['abs(-10 - 5)', ['abs', '(', '-', '10', '-', '5', ')']],
|
|
218
|
+
['abs(12 * 3)', ['abs', '(', '12', '*', '3', ')']],
|
|
219
|
+
['abs(-15 / 5)', ['abs', '(', '-', '15', '/', '5', ')']],
|
|
220
|
+
// Mixed operations
|
|
221
|
+
['6 + sqrt(4)', ['6', '+', 'sqrt', '(', '4', ')']],
|
|
222
|
+
['abs(3) + 5', ['abs', '(', '3', ')', '+', '5']],
|
|
223
|
+
['-sqrt(16) - 2', ['-', 'sqrt', '(', '16', ')', '-', '2']],
|
|
224
|
+
['(6 + 5) * abs(-3)', ['(', '6', '+', '5', ')', '*', 'abs', '(', '-', '3', ')']],
|
|
225
|
+
['sqrt(25) / abs(-5)', ['sqrt', '(', '25', ')', '/', 'abs', '(', '-', '5', ')']],
|
|
226
|
+
['abs(6 - 2) + sqrt(9)', ['abs', '(', '6', '-', '2', ')', '+', 'sqrt', '(', '9', ')']],
|
|
227
|
+
['-abs(8) * sqrt(4)', ['-', 'abs', '(', '8', ')', '*', 'sqrt', '(', '4', ')']],
|
|
228
|
+
['abs(-10) / (2 + 3)', ['abs', '(', '-', '10', ')', '/', '(', '2', '+', '3', ')']],
|
|
229
|
+
];
|
|
230
|
+
}
|