public static Expr ExprFromExprContext(LatteParser.ExprContext context) { if (context == null) { return(null); } return(context switch { LatteParser.EAddOpContext eAddOpContext => new AddOp(eAddOpContext), LatteParser.EAndContext eAndContext => new And(eAndContext), LatteParser.EFalseContext eFalseContext => new Bool(eFalseContext), LatteParser.EFunCallContext eFunCallContext => new FunCall(eFunCallContext), LatteParser.EIdContext eIdContext => new ID(eIdContext), LatteParser.EIntContext eIntContext => new Int(eIntContext), LatteParser.EMethodCallContext eMethodCallContext => new MethodCall(eMethodCallContext), LatteParser.EMulOpContext eMulOpContext => new MulOp(eMulOpContext), LatteParser.ENewObjectContext eNewObjectContext => new NewObject(eNewObjectContext), LatteParser.ENullContext _ => new Null(), LatteParser.ENullCastContext _ => new Null(), LatteParser.EObjectFieldContext eObjectFieldContext => new ObjectField(eObjectFieldContext), LatteParser.EOrContext eOrContext => new Or(eOrContext), LatteParser.EParenContext eParenContext => ExprFromExprContext(eParenContext.expr()), LatteParser.ERelOpContext eRelOpContext => new RelOp(eRelOpContext), LatteParser.EStrContext eStrContext => new Str(eStrContext), LatteParser.ETrueContext eTrueContext => new Bool(eTrueContext), LatteParser.EUnOpContext eUnOpContext => new UnOp(eUnOpContext), _ => throw new ArgumentOutOfRangeException(nameof(context)) });
public override LatteParser.TypeContext VisitEAddOp(LatteParser.EAddOpContext context) { var lhs = Visit(context.expr()[0]); var rhs = Visit(context.expr()[1]); switch (context.addOp()) { case LatteParser.PlusContext _: if (!lhs.Equals(rhs) || (!lhs.Equals(new LatteParser.TIntContext()) && !lhs.Equals(new LatteParser.TStringContext()))) { Utils.StateUtils.InterruptWithMessage(context.start.Line, ErrorMessages.AddOpWrongType); } return(lhs); case LatteParser.MinusContext _: if (!lhs.Equals(rhs) || !lhs.Equals(new LatteParser.TIntContext())) { Utils.StateUtils.InterruptWithMessage(context.start.Line, ErrorMessages.MinusOpToNotInt); } return(new LatteParser.TIntContext()); default: throw new NotSupportedException(); } }
public AddOp(LatteParser.EAddOpContext context) : base(context.expr()[0], context.expr()[1]) { Add = context.addOp() switch { LatteParser.PlusContext _ => Add.Plus, LatteParser.MinusContext _ => Add.Minus }; }