56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
const { parse, ConstantNode } = require('../..')
|
|
|
|
// Filter an expression tree
|
|
console.log('Filter all symbol nodes "x" in the expression "x^2 + x/4 + 3*y"')
|
|
const node = parse('x^2 + x/4 + 3*y')
|
|
const filtered = node.filter(function (node) {
|
|
return node.isSymbolNode && node.name === 'x'
|
|
})
|
|
// returns an array with two entries: two SymbolNodes 'x'
|
|
|
|
filtered.forEach(function (node) {
|
|
console.log(node.type, node.toString())
|
|
})
|
|
// outputs:
|
|
// SymbolNode x
|
|
// SymbolNode x
|
|
|
|
// Traverse an expression tree
|
|
console.log()
|
|
console.log('Traverse the expression tree of expression "3 * x + 2"')
|
|
const node1 = parse('3 * x + 2')
|
|
node1.traverse(function (node, path, parent) {
|
|
switch (node.type) {
|
|
case 'OperatorNode':
|
|
console.log(node.type, node.op)
|
|
break
|
|
case 'ConstantNode':
|
|
console.log(node.type, node.value)
|
|
break
|
|
case 'SymbolNode':
|
|
console.log(node.type, node.name)
|
|
break
|
|
default: console.log(node.type)
|
|
}
|
|
})
|
|
// outputs:
|
|
// OperatorNode +
|
|
// OperatorNode *
|
|
// ConstantNode 3
|
|
// SymbolNode x
|
|
// ConstantNode 2
|
|
|
|
// transform an expression tree
|
|
console.log()
|
|
console.log('Replace all symbol nodes "x" in expression "x^2 + 5*x" with a constant 3')
|
|
const node2 = parse('x^2 + 5*x')
|
|
const transformed = node2.transform(function (node, path, parent) {
|
|
if (node.isSymbolNode && node.name === 'x') {
|
|
return new ConstantNode(3)
|
|
} else {
|
|
return node
|
|
}
|
|
})
|
|
console.log(transformed.toString())
|
|
// outputs: '3 ^ 2 + 5 * 3'
|