private static Parser <Expression> StringTerm(ValuePropertyContainer container) { return((from op in StringOperatorTerm from value in ParserUtility.ConstantString select CallSetValue(op, value, container)) .Named("StringValueExpression")); }
private static Parser <Expression> NumericTerm(ValuePropertyContainer container) { return((from op in NumericOperatorTerm from value in ParserUtility.ConstantNumber select CallSetValue(op, value, container)) .Named("NumericValueExpression")); }
private static Parser <Tuple <PropertyInfo, Expression, Expression> > ArgumentsTerm(string functionName, AffectableEntityInfoContainer container) { AffectableEntityInfo info; if (!container.EntityInfoCache.TryGetAffectableEntityInfo(functionName, out info)) { throw new ArgumentException(string.Format("Function name {0} is not found in entityInfoCache.", functionName)); } var parameter = container.ParameterCache.Get(functionName); var prop = new ValuePropertyContainer(info, functionName, parameter); Func <int, Parser <Expression> > argsExpr = i => (from separator in Comma from item in CallKeyTerm(info, parameter.Item1, i).Parser select item); return((from keys in (from firstKey in CallKeyTerm(info, parameter.Item1, 0).Parser.Once() from tailKey in KeyTermMany(argsExpr, 1) select firstKey.Concat(tailKey)) from comma in Comma from v in ValueTerm(prop).Parser.Once() select Tuple.Create(info.PropertyInfo, Join(keys.ToArray()), v.First())).Or(ValueOnlyArgumentTerm(prop))); }
private static Parser <Tuple <PropertyInfo, Expression, Expression> > ValueOnlyArgumentTerm(ValuePropertyContainer container) { return(from v in ValueTerm(container).Parser.Once() select Tuple.Create <PropertyInfo, Expression, Expression>(container.EntityInfo.PropertyInfo, Expression.Empty(), v.First())); }
private static ParserWithContainer <Expression, ValuePropertyContainer> ValueTerm(ValuePropertyContainer container) { return(new ParserWithContainer <Expression, ValuePropertyContainer>( ValueParser.ParseExpression(container), container)); }
private static ParserWithContainer <Expression, ValuePropertyContainer> Expr(ValuePropertyContainer container) { return(new ParserWithContainer <Expression, ValuePropertyContainer>( NumericTerm(container).Or(StringTerm(container)), container)); }
private static Expression CallSetValue(ExpressionType operand, Tuple <Type, string> value, ValuePropertyContainer container) { var infos = container.Properties.Select(prop => new ValueOperatorInfo { ExpressionType = operand, PropertyName = prop.PropertyInfo.Name, Value = AffectorUtility.CreateValueExpression(prop.PropertyInfo.PropertyType, value), }).ToArray(); return(container.EntityInfo.IfThenSection(container.Parameter, container.NewParameter, infos)); }
public static Parser <Expression> ParseExpression(ValuePropertyContainer container) { return(Expr(container).Parser); }