From 5a8f9de2a11622d74b55132c9564a690e5927829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Sun, 5 Oct 2025 17:25:49 +0200 Subject: [PATCH] preparado para expresiones en los valores de entrada --- lib/ai/formula_screen.dart | 4 +++- lib/formula_evaluator.dart | 39 ++++++++++++++++++++++++++------------ lib/formula_models.dart | 1 - test/dart_test.dart | 10 ++++++++++ 4 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 test/dart_test.dart diff --git a/lib/ai/formula_screen.dart b/lib/ai/formula_screen.dart index 72ec462..493e1a2 100644 --- a/lib/ai/formula_screen.dart +++ b/lib/ai/formula_screen.dart @@ -56,7 +56,9 @@ class _FormulaScreenState extends State { try { final inputValues = {}; for (final input in widget.formula.input) { - final value = double.tryParse(_inputControllers[input.name]!.text) ?? 0.0; + final text = _inputControllers[input.name]!.text; + //final value = double.tryParse(text) ?? 0.0; + final value = FormulaEvaluator.evaluateExpression(text); // Convert input to base unit if needed // Always convert from dropdown unit to variable's base unit diff --git a/lib/formula_evaluator.dart b/lib/formula_evaluator.dart index df42aaf..3f6c89e 100644 --- a/lib/formula_evaluator.dart +++ b/lib/formula_evaluator.dart @@ -21,34 +21,36 @@ class FormulaEvaluationException implements Exception { } class MyMath{ - static Number log(Number x) => Math.log(x); - static Number pow(Number b, Number e) => Math.pow(b,e) as Number; + static Number myLog(Number x) => Math.log(x); + static Number myPow(Number b, Number e) => Math.pow(b,e) as Number; } class FormulaEvaluator { final D4rt _interpreter; - FormulaEvaluator([D4rt? interpreter]) : _interpreter = interpreter ?? D4rt(){ + static D4rt createDefaultInterpreter() => D4rt(); + + FormulaEvaluator([D4rt? interpreter]) : _interpreter = interpreter ?? createDefaultInterpreter(){ prepareInterpreter(_interpreter); } - Number getNumberValueOf(String s){ + static Number getNumberValueOf(String s){ return double.parse(s); } - void prepareInterpreter(D4rt interpreter){ + static void prepareInterpreter(D4rt interpreter){ final myMathDefinition = BridgedClass( nativeType: MyMath, - name: 'Math', + name: 'MyMath', staticMethods: { - 'pow': (visitor, positionalArgs, namedArgs) { + 'myPow': (visitor, positionalArgs, namedArgs) { final Number base = getNumberValueOf( positionalArgs[0].toString() ); final Number exp = getNumberValueOf( positionalArgs[1].toString() ); - return MyMath.pow(base,exp); + return MyMath.myPow(base,exp); }, - 'log': (visitor, positionalArgs, namedArgs) { + 'myLog': (visitor, positionalArgs, namedArgs) { final Number x = getNumberValueOf( positionalArgs[0].toString() ); - return MyMath.log(x); + return MyMath.myLog(x); }, } ); @@ -56,6 +58,20 @@ class FormulaEvaluator { interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart"); } + + static dynamic evaluateExpression(String code) { + final interpreter = createDefaultInterpreter(); + prepareInterpreter(interpreter); + final d4rtCode = """ + import 'dart:math'; + import "package:d4rt_formulas.dart"; + main() + { + return $code; + }"""; + final result = interpreter.execute(source: d4rtCode); + return result.toDouble(); + } dynamic evaluate(Formula formula, Map inputValues) { _validateInputValues(formula, inputValues); @@ -98,9 +114,8 @@ class FormulaEvaluator { buffer.writeln(""" import 'dart:math'; + import "package:d4rt_formulas.dart"; - //log(x) => M.log(x); - //pow(a,b) => M.pow(a,b); main() { diff --git a/lib/formula_models.dart b/lib/formula_models.dart index 541a21c..ebdf047 100644 --- a/lib/formula_models.dart +++ b/lib/formula_models.dart @@ -102,7 +102,6 @@ class UnitSpec { class VariableSpec { final String name; final String unit; - static final MAGNITUDELESS = "magnitudeless"; VariableSpec({required this.name, required this.unit}); diff --git a/test/dart_test.dart b/test/dart_test.dart new file mode 100644 index 0000000..9777d46 --- /dev/null +++ b/test/dart_test.dart @@ -0,0 +1,10 @@ +import 'package:test/test.dart'; +import 'package:d4rt/d4rt.dart'; +import 'dart:math' as Math; + + +main(){ + test('for dart grammar tests', () { + + }); +}