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); }
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); }
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); }