123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import { factory } from '../utils/factory.js';
- import { createEmptyMap, toObject } from '../utils/map.js';
- var name = 'Parser';
- var dependencies = ['evaluate'];
- export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {
- var {
- evaluate
- } = _ref;
- /**
- * @constructor Parser
- * Parser contains methods to evaluate or parse expressions, and has a number
- * of convenience methods to get, set, and remove variables from memory. Parser
- * keeps a scope containing variables in memory, which is used for all
- * evaluations.
- *
- * Methods:
- * const result = parser.evaluate(expr) // evaluate an expression
- * const value = parser.get(name) // retrieve a variable from the parser
- * const values = parser.getAll() // retrieve all defined variables
- * parser.set(name, value) // set a variable in the parser
- * parser.remove(name) // clear a variable from the
- * // parsers scope
- * parser.clear() // clear the parsers scope
- *
- * Example usage:
- * const parser = new Parser()
- * // Note: there is a convenience method which can be used instead:
- * // const parser = new math.parser()
- *
- * // evaluate expressions
- * parser.evaluate('sqrt(3^2 + 4^2)') // 5
- * parser.evaluate('sqrt(-4)') // 2i
- * parser.evaluate('2 inch in cm') // 5.08 cm
- * parser.evaluate('cos(45 deg)') // 0.7071067811865476
- *
- * // define variables and functions
- * parser.evaluate('x = 7 / 2') // 3.5
- * parser.evaluate('x + 3') // 6.5
- * parser.evaluate('f(x, y) = x^y') // f(x, y)
- * parser.evaluate('f(2, 3)') // 8
- *
- * // get and set variables and functions
- * const x = parser.get('x') // 7
- * const f = parser.get('f') // function
- * const g = f(3, 2) // 9
- * parser.set('h', 500)
- * const i = parser.evaluate('h / 2') // 250
- * parser.set('hello', function (name) {
- * return 'hello, ' + name + '!'
- * })
- * parser.evaluate('hello("user")') // "hello, user!"
- *
- * // clear defined functions and variables
- * parser.clear()
- *
- */
- function Parser() {
- if (!(this instanceof Parser)) {
- throw new SyntaxError('Constructor must be called with the new operator');
- }
- Object.defineProperty(this, 'scope', {
- value: createEmptyMap(),
- writable: false
- });
- }
- /**
- * Attach type information
- */
- Parser.prototype.type = 'Parser';
- Parser.prototype.isParser = true;
- /**
- * Parse and evaluate the given expression
- * @param {string | string[]} expr A string containing an expression,
- * for example "2+3", or a list with expressions
- * @return {*} result The result, or undefined when the expression was empty
- * @throws {Error}
- */
- Parser.prototype.evaluate = function (expr) {
- // TODO: validate arguments
- return evaluate(expr, this.scope);
- };
- /**
- * Get a variable (a function or variable) by name from the parsers scope.
- * Returns undefined when not found
- * @param {string} name
- * @return {* | undefined} value
- */
- Parser.prototype.get = function (name) {
- // TODO: validate arguments
- if (this.scope.has(name)) {
- return this.scope.get(name);
- }
- };
- /**
- * Get a map with all defined variables
- * @return {Object} values
- */
- Parser.prototype.getAll = function () {
- return toObject(this.scope);
- };
- /**
- * Get a map with all defined variables
- * @return {Map} values
- */
- Parser.prototype.getAllAsMap = function () {
- return this.scope;
- };
- /**
- * Set a symbol (a function or variable) by name from the parsers scope.
- * @param {string} name
- * @param {* | undefined} value
- */
- Parser.prototype.set = function (name, value) {
- this.scope.set(name, value);
- return value;
- };
- /**
- * Remove a variable from the parsers scope
- * @param {string} name
- */
- Parser.prototype.remove = function (name) {
- this.scope.delete(name);
- };
- /**
- * Clear the scope with variables and functions
- */
- Parser.prototype.clear = function () {
- this.scope.clear();
- };
- return Parser;
- }, {
- isClass: true
- });
|