示例#1
0
        public override object VisitExpression([NotNull] ExpressionContext context)
        {
            var count = context.ChildCount;
            var r     = new Result();

            if (count == 3)
            {
                var e1 = (Result)Visit(context.GetChild(0));
                var op = Visit(context.GetChild(1));
                var e2 = (Result)Visit(context.GetChild(2));
                if (context.GetChild(1).GetType() == typeof(JudgeContext))
                {
                    // todo 如果左右不是bool类型值,报错
                    r.data = bl;
                }
                else if (context.GetChild(1).GetType() == typeof(AddContext))
                {
                    // todo 如果左右不是number或text类型值,报错
                    if ((string)e1.data == str || (string)e2.data == str)
                    {
                        r.data = str;
                    }
                    else if ((string)e1.data == i32 && (string)e2.data == i32)
                    {
                        r.data = i32;
                    }
                    else
                    {
                        r.data = f64;
                    }
                }
                else if (context.GetChild(1).GetType() == typeof(MulContext))
                {
                    // todo 如果左右不是number类型值,报错
                    if ((string)e1.data == i32 && (string)e2.data == i32)
                    {
                        r.data = i32;
                    }
                    else
                    {
                        r.data = f64;
                    }
                }
                else if (context.GetChild(1).GetType() == typeof(PowContext))
                {
                    // todo 如果左右部署number类型,报错
                    r.data = f64;
                    switch (op)
                    {
                    case "**":
                        op = "pow";
                        break;

                    case "//":
                        op = "root";
                        break;

                    case "%%":
                        op = "log";
                        break;

                    default:
                        break;
                    }
                    r.text = $"{op}({e1.text}, {e2.text})";
                    return(r);
                }
                r.text = e1.text + op + e2.text;
            }
            else if (count == 2)
            {
                r = (Result)Visit(context.GetChild(0));
                if (context.op.Type == XsParser.Judge)
                {
                    r.text += "?";
                }
            }
            else if (count == 1)
            {
                r = (Result)Visit(context.GetChild(0));
            }
            return(r);
        }
示例#2
0
        public override object VisitExpression(ExpressionContext context)
        {
            var count = context.ChildCount;
            var r     = (new Result());

            switch (count)
            {
            case 3:
            { var e1 = (Result)(Visit(context.GetChild(0)));
              var e2 = Visit(context.GetChild(2));
              var op = Visit(context.GetChild(1));
              switch (context.GetChild(1))
              {
              case CompareCombineContext it:
              { r.data = I32;
    var s1 = e1.text;
    var s2 = ((Result)(e2)).text;
    r.text = (new System.Text.StringBuilder().Append(s1).Append(" > ").Append(s2).Append(" ? 1 : ( ").Append(s1).Append("==").Append(s2).Append(" ? 0 : -1 )")).to_str();
    return(r); } break;

              case CompareContext it:
              { r.data = Bool; } break;

              case LogicContext it:
              { r.data = Bool; } break;

              case AddContext it:
              { if ((string)(e1.data) == Str || (string)(((Result)(e2)).data) == Str)
    {
        r.data = Str;
    }
    else if ((string)(e1.data) == I32 && (string)(((Result)(e2)).data) == I32)
    {
        r.data = I32;
    }
    else
    {
        r.data = F64;
    } } break;

              case MulContext it:
              { if ((string)(e1.data) == I32 && (string)(((Result)(e2)).data) == I32)
    {
        r.data = I32;
    }
    else
    {
        r.data = F64;
    } } break;

              case PowContext it:
              { r.data = F64;
    r.text             = (new System.Text.StringBuilder().Append(op).Append("(").Append(e1.text).Append(", ").Append(((Result)(e2)).text).Append(")")).to_str();
    return(r); } break;
              }
              r.text = e1.text + op + ((Result)(e2)).text; } break;

            case 2:
            { r = (Result)(Visit(context.GetChild(0)));
              switch (context.GetChild(1))
              {
              case TypeConversionContext it:
              { var e2 = (string)(Visit(it));
    r.data = e2;
    r.text = (new System.Text.StringBuilder().Append("(").Append(e2).Append(")(").Append(r.text).Append(")")).to_str(); } break;

              case TypeCheckContext it:
              { var e2 = (string)(Visit(it));
    r.data = e2;
    r.text = (new System.Text.StringBuilder().Append(r.text).Append(".@is<").Append(e2).Append(">()")).to_str(); } break;

              case OrElseContext it:
              { var e2 = (Result)(Visit(it));
    r.text = (new System.Text.StringBuilder().Append("(").Append(r.text).Append("??").Append(e2.text).Append(")")).to_str(); } break;

              case CallExpressionContext it:
              { var e2 = (Result)(Visit(it));
    r.text = r.text + e2.text; } break;

              case CallFuncContext it:
              { var e2 = (Result)(Visit(it));
    if (this.is_type(r.rootID))
    {
        r.text = (new System.Text.StringBuilder().Append("(new ").Append(r.text).Append(e2.text).Append(")")).to_str();
        r.data = r.rootID;
    }
    else
    {
        r.text = r.text + e2.text;
    } } break;

              case CallAsyncContext it:
              { var e2 = (Result)(Visit(it));
    r.text = r.text + e2.text; } break;

              case CallAwaitContext it:
              { var e2 = (Result)(Visit(it));
    r.text = "await " + r.text + e2.text;
    set_func_async(); } break;

              case CallElementContext it:
              { var e2 = (Result)(Visit(it));
    r.text = r.text + e2.text; } break;

              default:
              { if (context.op.Type == FeelParser.Bang)
    {
        r.text = (new System.Text.StringBuilder().Append("ref ").Append(r.text)).to_str();
    }
    else if (context.op.Type == FeelParser.Question)
    {
        r.text += "?";
    }
              } break;
              }
            } break;

            case 1:
            { r = (Result)(Visit(context.GetChild(0))); } break;
            }
            return(r);
        }
示例#3
0
        public override object VisitExpression(ExpressionContext context)
        {
            var count = context.ChildCount;
            var r     = (new Result());

            switch (count)
            {
            case 3:
            { var e1 = ((Result)Visit(context.GetChild(0)));
              var e2 = Visit(context.GetChild(2));
              var op = Visit(context.GetChild(1));
              switch (context.GetChild(1))
              {
              case CompareContext it:
              { r.data = TargetTypeBool; } break;

              case LogicContext it:
              { r.data = TargetTypeBool; } break;

              case AddContext it:
              { if (((string)e1.data) == TargetTypeStr || ((string)((Result)e2).data) == TargetTypeStr)
    {
        r.data = TargetTypeStr;
    }
    else if (((string)e1.data) == TargetTypeI32 && ((string)((Result)e2).data) == TargetTypeI32)
    {
        r.data = TargetTypeI32;
    }
    else
    {
        r.data = TargetTypeF64;
    } } break;

              case MulContext it:
              { if (((string)e1.data) == TargetTypeI32 && ((string)((Result)e2).data) == TargetTypeI32)
    {
        r.data = TargetTypeI32;
    }
    else
    {
        r.data = TargetTypeF64;
    } } break;

              case PowContext it:
              { r.data = TargetTypeF64;
    r.text             = (new System.Text.StringBuilder().Append(op).Append("(").Append(e1.text).Append(", ").Append(((Result)e2).text).Append(")")).To_Str();
    return(r); } break;
              }
              r.text = e1.text + op + ((Result)e2).text; } break;

            case 2:
            { r = ((Result)Visit(context.GetChild(0)));
              switch (context.GetChild(1))
              {
              case TypeConversionContext it:
              { var e2 = ((string)Visit(it));
    r.data = e2;
    r.text = (new System.Text.StringBuilder().Append("((").Append(e2).Append(")").Append(r.text).Append(")")).To_Str(); } break;

              case TypeCheckContext it:
              { var e2 = ((string)Visit(it));
    r.data = e2;
    r.text = (new System.Text.StringBuilder().Append("(").Append(r.text).Append(" is ").Append(e2).Append(")")).To_Str(); } break;

              case OrElseContext it:
              { var e2 = ((Result)Visit(it));
    r.text = (new System.Text.StringBuilder().Append("(").Append(r.text).Append("??").Append(e2.text).Append(")")).To_Str(); } break;

              case CallExpressionContext it:
              { var e2 = ((Result)Visit(it));
    r.text = r.text + e2.text; } break;

              case CallFuncContext it:
              { var e2 = ((Result)Visit(it));
    if (Is_type(r.rootID))
    {
        r.text = (new System.Text.StringBuilder().Append("(new ").Append(r.text).Append(e2.text).Append(")")).To_Str();
        r.data = r.rootID;
    }
    else
    {
        r.text = r.text + e2.text;
    } } break;

              case CallAsyncContext it:
              { var e2 = ((Result)Visit(it));
    r.text = r.text + e2.text; } break;

              case CallElementContext it:
              { var e2 = ((Result)Visit(it));
    r.text = r.text + e2.text; } break;

              default:
              { if (context.op.Type == FeelParser.Bang)
    {
        r.text = (new System.Text.StringBuilder().Append("ref ").Append(r.text)).To_Str();
    }
    else if (context.op.Type == FeelParser.Question)
    {
        r.text += "?";
    }
              } break;
              }
            } break;

            case 1:
            { r = ((Result)Visit(context.GetChild(0))); } break;
            }
            return(r);
        }