Having a base class for expressions lets you build expressions out of other expressions.
public abstract class BaseExpression
{
}
public class VariableExpression : BaseExpression
{
public string Var {get; set;}
public int Exponent {get; set;}
}
public class ConstExpression : BaseExpression
{
public object Val {get; set;}
}
public class BinExpression : BaseExpression
{
public BaseExpression Left { get; set; }
public BaseExpression Right { get; set; }
public string Operator { get; set; }
}
For example x(y-1)
would be
var xy_1 = new BinExpression()
{
Left = new VariableExpression() { Var = "x" },
Right = new BinExpression()
{
Left = new VariableExpression() { Var = "y" },
Right = new ConstExpression() { Val = "1" },
Operator = "-"
},
Operator = "*"
}