使用NCalc在表达式中获取参数

Pre*_*eli 8 c# string expression ncalc

我有一个表达式,我想解析,以获取所有使用的参数的列表.

例如:"X + 5 /(Y - 1)"应该给我以下结果:X,Y

我已经在我的项目中使用了NCalc; 那么可以使用NCalc来获取表达式中使用的参数吗?

根据这个讨论条目(https://ncalc.codeplex.com/discussions/361959),它是,但我不太明白答案.

Chr*_*air 12

从讨论/答案:http://ncalc.codeplex.com/discussions/360990

我已经测试并运行的实现(对于您提供的示例表达式)是实现a LogicalExpressionVisitor并让它记录下找到的参数:

class ParameterExtractionVisitor : LogicalExpressionVisitor
{
    public HashSet<string> Parameters = new HashSet<string>();

    public override void Visit(NCalc.Domain.Identifier function)
    {
        //Parameter - add to list
        Parameters.Add(function.Name);
    }

    public override void Visit(NCalc.Domain.UnaryExpression expression)
    {
        expression.Accept(this);
    }

    public override void Visit(NCalc.Domain.BinaryExpression expression)
    {
        //Visit left and right
        expression.LeftExpression.Accept(this);
        expression.RightExpression.Accept(this);
    }

    public override void Visit(NCalc.Domain.TernaryExpression expression)
    {
        //Visit left, right and middle
        expression.LeftExpression.Accept(this);
        expression.RightExpression.Accept(this);
        expression.MiddleExpression.Accept(this);
    }

    public override void Visit(Function function)
    {
        foreach (var expression in function.Expressions)
        {
            expression.Accept(this);
        }
    }

    public override void Visit(LogicalExpression expression)
    {
        expression.Accept(this);
    }

    public override void Visit(ValueExpression expression)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

然后你会用它作为:

var expression = NCalc.Expression.Compile("2 * [x] ^ 2 + 5 * [y]", false);

ParameterExtractionVisitor visitor = new ParameterExtractionVisitor();
expression.Accept(visitor);

var extractedParameters = visitor.Parameters;

foreach (var param in extractedParameters)
    Console.WriteLine(param);
Run Code Online (Sandbox Code Playgroud)

这为我输出"x"和"y".

注意使用HashSetParameterExtractionVisitor.这是因为如果您的表达式多次包含相同的变量(例如:) "[x] + [x]",它将被添加两次.如果要在每次使用相同变量时存储条目,请将其替换为HashSeta List.


总而言之,我对NCalc的经验很少,所以我对被覆盖方法的实现LogicalExpressionVisitor猜测.当我用这个void Visit(ValueExpression expression)方法覆盖expression.Accept(this)它时,它产生了一个StackOverflowException.所以我只是把实现留空了似乎工作.因此,我建议你在这里拿我的回答有一个非常大粒盐.您的里程可能会有所不同,我不能说这是否适用于所有类型的表达.

  • 对于Visit(函数函数),你需要删除函数.接受(this)并添加foreach(函数.Expressions中的var表达式)expression.Accept(this); (2认同)