public override object VisitAddExpression([NotNull] TinyScriptParser.AddExpressionContext context)
        {
            var a = VisitMulExpression(context.mulExpression(0));

            for (int i = 1; i < context.ChildCount; i += 2)
            {
                var op = context.GetChild(i).GetText();
                var b  = VisitMulExpression((TinyScriptParser.MulExpressionContext)context.GetChild(i + 1));
                switch (op)
                {
                case "+":
                    if (a is string || b is string)
                    {
                        a = a.ToString() + b.ToString();
                    }
                    else
                    {
                        a = (decimal)a + (decimal)b;
                    }
                    break;

                case "-":
                    a = (decimal)a - (decimal)b;
                    break;
                }
            }
            return(a);
        }
        public override object VisitAddExpression([NotNull] TinyScriptParser.AddExpressionContext context)
        {
            var ret = (Type)VisitMulExpression(context.mulExpression(0));

            if (context.ChildCount > 1)
            {
                Type typeAdd = null;
                for (int i = 1; i < context.ChildCount; i += 2)
                {
                    var op = context.GetChild(i).GetText();
                    var t2 = (Type)VisitMulExpression((TinyScriptParser.MulExpressionContext)context.GetChild(i + 1));
                    typeAdd = ret == typeof(string) ? ret : GetOpType(context, ret, t2);
                    if (ret == typeof(string) && t2.IsValueType)
                    {
                        _builder.Box(t2);
                    }
                    var b = OpBuilder.GetOpBuilder(typeAdd, context, _builder);
                    b.ProcessAdd(op);
                }
                return(typeAdd);
            }
            return(ret);
        }
 /// <summary>
 /// Visit a parse tree produced by <see cref="TinyScriptParser.addExpression"/>.
 /// <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 VisitAddExpression([NotNull] TinyScriptParser.AddExpressionContext context)
 {
     return(VisitChildren(context));
 }