code: def p_substr_assignment_no_let(p):
      
      # This can be only a substr assignment like a$(i + 3) = ".", since arrays
      # have ARRAY_ID already
      entry = SYMBOL_TABLE.access_call(p[1], p.lineno(1))
      if entry is None:
          return
  
      if entry.class_ == CLASS.unknown:
          entry.class_ = CLASS.var
  
      if p[6].type_ != TYPE.string:
          api.errmsg.syntax_error_expected_string(p.lineno(5), p[6].type_)
  
      lineno = p.lineno(2)
      base = make_number(OPTIONS.string_base.value, lineno, _TYPE(gl.STR_INDEX_TYPE))
      substr = make_typecast(_TYPE(gl.STR_INDEX_TYPE), p[3], lineno)
      p[0] = make_sentence('LETSUBSTR', entry,
                           make_binary(lineno, 'MINUS', substr, base, func=lambda x, y: x - y),
                           make_binary(lineno, 'MINUS', substr, base, func=lambda x, y: x - y),
                           p[6])
docs: statement : ID LP expr RP EQ expr