コード例 #1
0
 public Parser(string text, ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants, bool consume_whole_text)
 {
     m_Tokenizer            = new Tokenizer.Tokenizer(text);
     m_ExecFuncEvaluator    = exec_func_evaluator;
     m_CompileTimeConstants = compile_time_constants == null ? (IVariableValueResolver) new VariableValueResolver() : compile_time_constants;
     m_ConsumeWholeText     = consume_whole_text;
 }
コード例 #2
0
            protected internal override Value EliminateConstSubExpressions(Private.ConstEvalContext ctx)
            {
                Value cond_expr = TryEliminateConstSubExpressions(ctx, SubExpressions[0]);

                if (cond_expr == null)
                {
                    Value true_expr = TryEliminateConstSubExpressions(ctx, SubExpressions[1]);
                    if (true_expr != null)
                    {
                        SubExpressions[1] = true_expr;
                    }
                    Value false_expr = TryEliminateConstSubExpressions(ctx, SubExpressions[2]);
                    if (false_expr != null)
                    {
                        SubExpressions[2] = false_expr;
                    }
                    return(null);
                }

                bool cond = cond_expr.ToBool();
                IVariableValueResolver local_ctx = SubExpressions[0].GetLocalContext();

                SubExpressions[0] = new BoolValueWithLocalContext(cond, local_ctx);

                if (local_ctx != null)
                {
                    ctx.PushLocalContext(local_ctx);
                }
                try
                {
                    Value v = TryEliminateConstSubExpressions(ctx, cond ? SubExpressions[1] : SubExpressions[2]);
                    if (v != null)
                    {
                        return(v);
                    }

                    if (cond)
                    {
                        SubExpressions[2] = null;
                    }
                    else
                    {
                        SubExpressions[1] = null;
                    }
                }
                finally
                {
                    if (local_ctx != null)
                    {
                        ctx.PopLocalContext();
                    }
                }

                return(null);
            }
コード例 #3
0
            public virtual Value GetVariableValue(Variable variable)
            {
                Value v;

                if (m_LocalContextStack.Count > 0)
                {
                    IVariableValueResolver local_ctx = m_LocalContextStack.Peek();
                    if (local_ctx != null)
                    {
                        v = local_ctx.GetVariableValue(variable);
                        if (v != null)
                        {
                            return(v);
                        }
                    }
                }
                throw new NotConstExpression(variable);
            }
コード例 #4
0
            protected internal override Value RecursiveCollectUnresolvedVariables(IEvalContext ctx)
            {
                Expression expr_ctx, expr_no_ctx;

                if (SubExpressions[0].RecursiveCollectUnresolvedVariables(ctx).ToBool())
                {
                    expr_ctx    = SubExpressions[1];
                    expr_no_ctx = SubExpressions[2];
                }
                else
                {
                    expr_ctx    = SubExpressions[2];
                    expr_no_ctx = SubExpressions[1];
                }

                if (expr_ctx != null)
                {
                    IVariableValueResolver local_ctx = SubExpressions[0].GetLocalContext();
                    if (local_ctx == null)
                    {
                        expr_ctx.RecursiveCollectUnresolvedVariables(ctx);
                    }
                    else
                    {
                        ctx.PushLocalContext(local_ctx);
                        try
                        {
                            expr_ctx.RecursiveCollectUnresolvedVariables(ctx);
                        }
                        finally
                        {
                            ctx.PopLocalContext();
                        }
                    }
                }

                if (expr_no_ctx != null)
                {
                    expr_no_ctx.RecursiveCollectUnresolvedVariables(ctx);
                }

                return(new BoolValue(false));
            }
コード例 #5
0
            public override Value Evaluate(IEvalContext ctx)
            {
                Expression             expr      = SubExpressions[0].Evaluate(ctx).ToBool() ? SubExpressions[1] : SubExpressions[2];
                IVariableValueResolver local_ctx = SubExpressions[0].GetLocalContext();

                if (local_ctx == null)
                {
                    return(expr.Evaluate(ctx));
                }
                else
                {
                    ctx.PushLocalContext(local_ctx);
                    try
                    {
                        Value res = expr.Evaluate(ctx);
                        return(res);
                    }
                    finally
                    {
                        ctx.PopLocalContext();
                    }
                }
            }
コード例 #6
0
        public virtual Value GetVariableValue(Variable variable)
        {
            Value v;

            if (m_LocalContextStack.Count > 0)
            {
                IVariableValueResolver local_ctx = m_LocalContextStack.Peek();
                if (local_ctx != null)
                {
                    v = local_ctx.GetVariableValue(variable);
                    if (v != null)
                    {
                        return(v);
                    }
                }
            }

            if (m_VariableValues.TryGetValue(variable.Name, out v))
            {
                return(v);
            }
            return(null);
        }
コード例 #7
0
 public Parser(string text, ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants)
     : this(text, exec_func_evaluator, compile_time_constants, true)
 {
 }
コード例 #8
0
 public CompiledExpressionCache(ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants, int max_size)
 {
     m_Cache                = new Cache <string, CompiledExpression>(CompileExpression, max_size);
     m_ExecFuncEvaluator    = exec_func_evaluator;
     m_CompileTimeConstants = compile_time_constants;
 }
コード例 #9
0
 public CompiledExpressionCache(ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants, int max_size)
 {
     m_Cache = new Cache<string, CompiledExpression>(CompileExpression, max_size);
     m_ExecFuncEvaluator = exec_func_evaluator;
     m_CompileTimeConstants = compile_time_constants;
 }
コード例 #10
0
 public BoolValueWithLocalContext(bool val, IVariableValueResolver local_ctx)
     : base(val)
 {
     m_LocalCtx = local_ctx;
 }
コード例 #11
0
 public virtual void PushLocalContext(IVariableValueResolver local_ctx)
 {
     Debug.Assert(local_ctx != null);
     m_LocalContextStack.Push(local_ctx);
 }
コード例 #12
0
 public virtual void PushLocalContext(IVariableValueResolver local_ctx)
 {
     m_Ctx.PushLocalContext(local_ctx);
 }
コード例 #13
0
 public Parser(string text, ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants, bool consume_whole_text)
 {
     m_Tokenizer = new Tokenizer.Tokenizer(text);
     m_ExecFuncEvaluator = exec_func_evaluator;
     m_CompileTimeConstants = compile_time_constants==null ? (IVariableValueResolver)new VariableValueResolver() : compile_time_constants;
     m_ConsumeWholeText = consume_whole_text;
 }
コード例 #14
0
 public Parser(string text, ExecFuncEvaluator exec_func_evaluator, IVariableValueResolver compile_time_constants)
     : this(text, exec_func_evaluator, compile_time_constants, true)
 {
 }