sklose/NCalc2

Please allow bracket in parameter name

Opened this issue · 3 comments

I wish I could write parameter name with bracket like this

var array = new float[] { 1,2,3,4,5,6 };
var e = new Expression("1 + (2 * [array[0]])");
e.EvaluateParameter += delegate(string name, ParameterArgs args) {
      // got "array[0]" as name
      if (name.StartsWith("array[") && name.EndsWith("]"))
      {
          int i = int.Parse(name.Replace("array[","").Replace("]",""));
          args.Result = array[i];
      }
};

If possible I would like to have it allow arbitrary nested bracket

var keys = new string[] { key0,key1,key2 };
var dict = new Dictionary<string,float>();
var e = new Expression("1 + (2 * [dict[key[0]]])");
e.EvaluateParameter += delegate(string name, ParameterArgs args) {
      // got "dict[key[0]]" as name for doing lookup
};

@sklose

Will changing this

NCalc2/grammer/NCalc.g

Lines 265 to 268 in 19359d6

NAME : '[' (options {greedy=false;} : ~(']')*) ']'
;

To this

NAME	:	'[' ( (options {greedy=false;} : ~('[' | ']')*) NAME* )* ']'
	;

Did the job?

Today I have clone your repo and change it to antlr4

This rule work for me

NAME	:	'[' (~('[' | ']') | NAME)*? ']'
	;

If you interest https://github.com/Thaina/NCalc2

@Thaina, I believe it'll be better to use EvaluateOptions.IterateParameters like this:

var e = Extensions.CreateExpression("x * x", EvaluateOptions.IterateParameters);
e.Parameters["x"] = new[] { 0, 1, 2, 3, 4 };
var result = (IList)e.Evaluate();
Assert.Equal(0, result[0]);
Assert.Equal(1, result[1]);
Assert.Equal(4, result[2]);
Assert.Equal(9, result[3]);
Assert.Equal(16, result[4]);