code: def p_arr_assignment(p):
      
      i = 2 if p[1].upper() == 'LET' else 1
      id_ = p[i]
      arg_list = p[i + 1]
      expr = p[i + 3]
  
      p[0] = None
      if arg_list is None or expr is None:
          return  # There were errors
  
      entry = SYMBOL_TABLE.access_call(id_, p.lineno(i))
      if entry is None:
          return
  
      if entry.type_ == TYPE.string:
          variable = gl.SYMBOL_TABLE.access_array(id_, p.lineno(i))
          if len(variable.bounds) + 1 == len(arg_list):
              ss = arg_list.children.pop().value
              p[0] = make_array_substr_assign(p.lineno(i), id_, arg_list, (ss, ss), expr)
              return
  
      arr = make_array_access(id_, p.lineno(i), arg_list)
      if arr is None:
          return
  
      expr = make_typecast(arr.type_, expr, p.lineno(i))
      if entry is None:
          return
  
      p[0] = make_sentence('LETARRAY', arr, expr)
docs: statement : ARRAY_ID arg_list EQ expr
                    | LET ARRAY_ID arg_list EQ expr