quds_formula_parser 0.0.2 copy "quds_formula_parser: ^0.0.2" to clipboard
quds_formula_parser: ^0.0.2 copied to clipboard

Dart package designed for parsing and evaluating mathematical, logical, and textual formulas. It enables developers to input complex expressions, such as arithmetic operations, functions, and even var [...]

example/quds_formula_parser_example.dart

import 'package:quds_formula_parser/quds_formula_parser.dart';
import 'dart:io';

void main() {
  _evaluateSimpleFormulas();

  _evaluatingWithVariables();

  _parseAndEvaluateWithCustomProvider();

  _changeVariableValueByFormula();

  _writeCustomFormula();
}

void _evaluateSimpleFormulas() {
  print('\nEvaluating simple formulas');

  print(_parseFormulaAndEvaluate('5 + 9 / 2')); // 9.5
  print(_parseFormulaAndEvaluate('Atom.weight(\'he)')); // 4.0026
  print(_parseFormulaAndEvaluate('5 - (2+7i)')); // 3.0 + -7.0i
  print(_parseFormulaAndEvaluate('Day(#2024-08-14#)')); // 14
  print(_parseFormulaAndEvaluate('Year(Today())')); // 2024
  print(_parseFormulaAndEvaluate(
      'If(And(Year(Today())%4=0,Year(Today())%100<>0),"Leap year","Not leap year")')); // Leap year / Not leap year
  print(_parseFormulaAndEvaluate('Point.Y({5,-7})')); // -7
  print(_parseFormulaAndEvaluate('Point.Y(Point(5,-2))')); // -2
}

dynamic _parseFormulaAndEvaluate(String str) {
  FormulaParser parser =
      FormulaParser(provider: FormulaProvider.defaultInstance);

  var formula = parser.parse(str);
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);
  var result = supporter.evaluate();
  if (result is ValueWrapper) return result.value;
  return result;
}

void _changeVariableValueByFormula() {
  print('\nSetting variable value by formula string');

  var provider = FormulaProvider.defaultInstance;
  FormulaParser parser = FormulaParser(provider: provider);
  String setterStr = 'SetVariable("y",5)';
  var setterFormula = parser.parse(setterStr);
  FormulaInfixToPostfixConvertor(formula: setterFormula).evaluate();

  String formulaStr = 'power(5,2)';
  var formula = parser.parse(formulaStr);
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);
  print('$formulaStr = ${supporter.evaluate()}');
}

void _evaluatingWithVariables() {
  print('\nEvaluating formula with changing variable value many times');
  var provider = FormulaProvider.defaultInstance;
  FormulaParser parser = FormulaParser(provider: provider);
  provider.insertVariable(Variable(symbol: 'x', value: 0));
  String formulaStr = 'power(x,2)';
  var formula = parser.parse(formulaStr);
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);

  Stopwatch stopwatch = Stopwatch();
  stopwatch.start();
  int times = 1000000;
  for (int i = 0; i < times; i++) {
    provider.setVariableValue('x', i);
    supporter.evaluate();
  }
  stopwatch.stop();
  print(
      '$formulaStr evaluating times($times) took ${stopwatch.elapsedMilliseconds} ms');
}

void _writeCustomFormula() {
  bool cont = false;
  String? formulaString;
  while (!cont) {
    stdout.writeln('\nEnter your formula: ');
    formulaString = stdin.readLineSync();
    if (formulaString == null || formulaString.trim().isEmpty) {
      cont = false;
    } else {
      cont = true;
    }
  }
  FormulaParser parser =
      FormulaParser(provider: FormulaProvider.defaultInstance);

  var formula = parser.parse(formulaString!);
  if (formula.errorParsingPosition == null) {
    var supporter = FormulaInfixToPostfixConvertor(formula: formula);
    var result = supporter.evaluate();
    stdout.writeln('Output: $result');
  } else {
    stdout.writeln(
        'The formula has parsing error at the position: ${formula.errorParsingPosition}');
  }
  _writeCustomFormula();
}

void _parseAndEvaluateWithCustomProvider() {
  print('\nParsing with evaluating with custom provider');

  // Prepare the terms provider
  FormulaProvider provider = FormulaProvider();
  provider.identifiers.addAll([
    BracketIdentifier(),
    NamedValuesIdentifier(provider: provider),
    FunctionIdentifier(functions: [_CustomFunction()])
  ]);

  // Prepare the parser
  var parser = FormulaParser(provider: provider);
  provider.insertVariable(Variable(symbol: 'x', value: 0));

  var formula = parser.parse('randomize(x)');

  var supporter = FormulaInfixToPostfixConvertor(formula: formula);
  for (int i = 0; i < 10; i++) {
    provider.setVariableValue('x', i);
    print(supporter.evaluate());
  }
}

class _CustomFunction extends FormulaFunction {
  _CustomFunction() : super(functionNotations: ['Custom.Rnd', 'Randomize']);

  @override
  calculate(List<ValueWrapper> parameters) {
    num arg = parameters.first.value;
    return arg * Random().nextInt(100);
  }

  @override
  bool checkParameters(List<ValueWrapper> terms) =>
      terms.length == 1 && terms.first.isRealNumber;
}
7
likes
0
points
117
downloads

Publisher

verified publisherquds.cc

Weekly Downloads

Dart package designed for parsing and evaluating mathematical, logical, and textual formulas. It enables developers to input complex expressions, such as arithmetic operations, functions, and even variables, which are then parsed and converted into a form that can be evaluated.

Repository (GitHub)
View/report issues

License

unknown (license)

More

Packages that depend on quds_formula_parser