コード例 #1
0
        public override Expression VisitPrimaryExpression([NotNull] RuleEngineParser.PrimaryExpressionContext context)
        {
            var primaryExpressionStartContext = context.primaryExpressionStart();
            var expression = VisitPrimaryExpressionStart(primaryExpressionStartContext);

            var bracketExpressionContexts = context.bracketExpression();//Not Implemented

            var memberAccessContexts     = context.memberAccess();
            var methodInvocationContexts = context.methodInvocation();

            if (memberAccessContexts.Length > 0 || memberAccessContexts.Length > 0)
            {
                for (int i = 1; i < context.ChildCount; i++)
                {
                    var parseTree = context.GetChild(i);
                    if (parseTree is RuleEngineParser.MemberAccessContext)
                    {
                        var constantExpression = VisitMemberAccess(parseTree as RuleEngineParser.MemberAccessContext) as ConstantExpression;

                        var parseTree1 = context.GetChild(i + 1);
                        if (parseTree1 is RuleEngineParser.MethodInvocationContext)
                        {
                            var blockExpression = VisitMethodInvocation(parseTree1 as RuleEngineParser.MethodInvocationContext) as BlockExpression;
                            expression = Expression.Call(expression, expression.Type.GetMethod(constantExpression.Value.ToString(), blockExpression.Expressions.Select(v => v.Type).ToArray()), blockExpression.Expressions);
                            i++;
                        }
                        else
                        {
                            expression = Expression.Property(expression, constantExpression.Value.ToString());
                        }
                    }
                }
            }

            return(expression);
        }
コード例 #2
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="RuleEngineParser.primaryExpression"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitPrimaryExpression([NotNull] RuleEngineParser.PrimaryExpressionContext context)
 {
     return(VisitChildren(context));
 }