code: def visitParam_def_elem(self, ctx:SystemRDLParser.Param_def_elemContext):
          
  
          # Construct parameter type
          data_type_token = self.visit(ctx.data_type())
          param_data_type = self.datatype_from_token(data_type_token)
          if ctx.array_type_suffix() is None:
              # Non-array type
              param_type = param_data_type
          else:
              # Array-like type
              param_type = rdltypes.ArrayPlaceholder(param_data_type)
  
          # Get parameter name
          param_name = get_ID_text(ctx.ID())
  
          # Get expression for parameter default, if any
          if ctx.expr() is not None:
              visitor = ExprVisitor(self.compiler)
              default_expr = visitor.visit(ctx.expr())
              default_expr = expressions.AssignmentCast(self.compiler.env, SourceRef.from_antlr(ctx.ID()), default_expr, param_type)
              default_expr.predict_type()
          else:
              default_expr = None
  
          # Create Parameter object
          param = Parameter(param_type, param_name, default_expr)
  
          # Register it in the parameter def namespace scope
          self.compiler.namespace.register_element(param_name, param, None, SourceRef.from_antlr(ctx.ID()))
  
          return param
docs: Individual parameter definition elements