code: @Override
      public Object visitAdditionOrSubtractionExpression(ExcellentParser.AdditionOrSubtractionExpressionContext ctx) {
          boolean add = ctx.PLUS() != null;
          Object arg1 = visit(ctx.expression(0));
          Object arg2 = visit(ctx.expression(1));
  
          // first try as decimals
          try {
              BigDecimal _arg1 = Conversions.toDecimal(arg1, m_evalContext);
              BigDecimal _arg2 = Conversions.toDecimal(arg2, m_evalContext);
              return add ? _arg1.add(_arg2, ExpressionUtils.MATH) : _arg1.subtract(_arg2, ExpressionUtils.MATH);
          } catch (EvaluationError ignored) {}
  
          // then as date + something
          try {
              Temporal _arg1 = Conversions.toDateOrDateTime(arg1, m_evalContext);
              TemporalAmount _arg2;
  
              if (arg2 instanceof OffsetTime) {
                  // upgrade our date to datetime
                  _arg1 = Conversions.toDateTime(_arg1, m_evalContext);
  
                  // convert time value to a duration
                  _arg2 = Duration.between(LocalTime.of(0, 0), ((OffsetTime) arg2).toLocalTime());
              }
              else {
                  _arg2 = Period.ofDays(Conversions.toInteger(arg2, m_evalContext));
              }
  
              return add ? _arg1.plus(_arg2) : _arg1.minus(_arg2);
  
          } catch (EvaluationError ex) {
              throw new EvaluationError("Expression could not be evaluated as decimal or date arithmetic", ex);
          }
      }
docs: expression: expression (PLUS | MINUS) expression