static ExpressionOptions() { var opDefs = new Dictionary <OperatorType, OperatorDefinition>(); void AddOpDef(int precedence, OperatorType type, OperatorSidedness sidedness, params char[] names) { var opDef = new OperatorDefinition(precedence, type, sidedness, names); opDefs.Add(type, opDef); } AddOpDef(0, OperatorType.Add, OperatorSidedness.OptionalLeft, '+'); AddOpDef(0, OperatorType.Subtract, OperatorSidedness.OptionalLeft, '-', '–'); AddOpDef(1, OperatorType.Multiply, OperatorSidedness.Both, '*', '×'); AddOpDef(1, OperatorType.Divide, OperatorSidedness.Both, '/', ':', '÷'); AddOpDef(1, OperatorType.Modulo, OperatorSidedness.Both, '%'); AddOpDef(2, OperatorType.Exponent, OperatorSidedness.Both, '^'); AddOpDef(2, OperatorType.Factorial, OperatorSidedness.Left, '!'); var opInverses = new List <OperatorInverse>(); void AddOpInverse(OperatorType source, OperatorType inverse) { var sourceOp = opDefs[source]; var inverseOp = opDefs[inverse]; opInverses.Add(new OperatorInverse(sourceOp, inverseOp)); } AddOpInverse(OperatorType.Add, OperatorType.Subtract); AddOpInverse(OperatorType.Subtract, OperatorType.Add); AddOpInverse(OperatorType.Multiply, OperatorType.Divide); AddOpInverse(OperatorType.Divide, OperatorType.Multiply); Default = new ExpressionOptions( opDefs.Values, opInverses, doImplicitMultiplications: true); }
public OperatorInverse( OperatorDefinition sourceDefinition, OperatorDefinition definition) { SourceDefinition = sourceDefinition ?? throw new ArgumentNullException(nameof(sourceDefinition)); Definition = definition ?? throw new ArgumentNullException(nameof(definition)); }