#QQQ $S:=u ##
--
--      operatory priswaiwaniq
--        := !.:= !!:=  +:= ++:=
--
---------------------------------------------------
#G_ASSGN

     $R:=  ASSGN:: <. op: $OP .>
     / IF $OP='!!:=' -> #G_ALONGLIST($R)
    ELSIF $OP='++:=' -> #G_ALONGTREE($R)
    ELSIF T          -> #G_ANORM($R) FI/ ##

#G_ANORM
       ASSGN:: <. op: ':='
                   / GEN<< '/* operator := */'/,

         lew:  ( ( INDEX::<. ARG1:
                               $A1:= #obxekt_ili_NULL,
                             ARG2:
                             $A2:= #INTEGER_ili_obxekt
                          .>
                   / $E:= #obqzatelxno_obxekt ($.praw);
                     GEN<< 'setind(' $A2  $A1 ','
                                          $E ')'/ )  !

                 ( SELECTOR:: <. ARG1: $A1:=
                                       #obxekt_ili_NULL,
                                 ARG2: $A2:=
                                   #ACONST_ili_obxekt .>
                     /$E:= #obqzatelxno_obxekt( $.praw);
                      GEN<< 'setsel(' $A2 $A1 ','
                                           $E ')'/ ) !

                 ( $E1 / #G_wyravenie( $E1);
                        $E:= $.praw;
                $E:= #obqzatelxno_obxekt( $E);
                GEN<< $E1.mesto '.sa=' $E /))
                .>  ;;

        ASSGN:: <. op: '!.:='
                        /GEN<< '/* operator !.:= */'/,
         praw: $E:= #obqzatelxno_obxekt,
         lew: ( ( INDEX:: <. ARG1:
                                 $A1:= #obxekt_ili_NULL,
                             ARG2:
                              $A2:= #INTEGER_ili_obxekt,
                             mesto: $W  .>
                   /GEN<<
                 'indxop(' $A2  $A1 ',&' $W '.sa);'
                 'lconc(&' $W '.sa,' $E ');'
                 'setind(' $A2  $A1 ',' $W '.sa)'
                    / ) !

                 ( SELECTOR:: <. ARG1: $A1:=
                                       #obxekt_ili_NULL,
                                 ARG2: $A2:=
                                     #ACONST_ili_obxekt,
                                 mesto: $W .>
                   /GEN<<
          'selop(' $A2 $A1 ',&' $W '.sa);lconc(&'
          $W '.sa,' $E ');if(' $W
          '.sa==NULL ) setsel(' $A2 $A1 ',NULL)'
                     / ) !

                 ( $E1 / #G_wyravenie( $E1);
                        GEN<< 'lconc(&' $E1.mesto '.sa,'
                               $E ')'/ ) )
                  .> ;;

        ASSGN:: <. op: '+:='
                        /GEN<< '/* operator +:= */'/,
                 praw: $E /#G_wyravenie( $E);
                           $A3:= #~islo_ili_0( $E)/,

                lew: ( ( INDEX:: <. ARG1:
                                 $A1:= #obxekt_ili_NULL,
                                    ARG2:
                              $A2:= #INTEGER_ili_obxekt,
                                    mesto: $W .>
          /GEN<< 'indxop(' $A2 $A1 ',&' $W '.sa);addnum(&'
                  $W '.sa,' $A3 ');setind(' $A2 $A1 ','
                  $W '.sa)' /           ) !
                        ( SELECTOR:: <. ARG1:
                                $A1:= #obxekt_ili_NULL,
                                        ARG2:
                               $A2:= #ACONST_ili_obxekt,
                                        mesto: $W .>
        /GEN<< 'selop(' $A2 $A1 ',&' $W '.sa);addnum(&' $W
                '.sa,' $A3 ');setsel(' $A2 $A1 ',' $W
                '.sa)' /                ) !
                        ( $E1 / #G_wyravenie( $E1);
                    GEN<< 'addnum(&' $E1.mesto '.sa,'
                          $A3 ')' /  )  )  .>
                                ##

---------------
#G_ALONGLIST

        ASSGN:: <. op: '!!:='
                        /GEN<< '/* operator !!:= */'/,
         praw: CONLIST:: <. [ BODY: $B ] .>,
         lew:  (( INDEX:: <. ARG1:
                                 $A1:= #obxekt_ili_NULL,
                             ARG2:
                              $A2:= #INTEGER_ili_obxekt,
                             mesto: $W .>
                  /GEN<< 'indxop(' $A2  $A1 ',&'
                                    $W '.sa);'/ ) !

                ( SELECTOR:: <. ARG1: $A1:=
                                       #obxekt_ili_NULL,
                                ARG2: $A2:=
                                     #ACONST_ili_obxekt,
                                mesto: $W .>
             / GEN<< 'selop(' $A2 $A1 ',&' $W '.sa);'/) !

                 ( $E1 /#G_wyravenie( $E1);
                        $W := $E1 .mesto / ) ),
        -- 2-j prohod
         praw:  <. [ BODY: (.
                       $EL:= #obqzatelxno_obxekt
                    / GEN<< 'lconc(&' $W '.sa,' $EL ');'/
                            (*
                       $EL:=#obqzatelxno_obxekt
                 / GEN<< 'if(' $W '.sa!=NULL ) lconc(&'
                          $W '.sa,' $EL ');' /
                             *) .) ]  .> ,
         lew: (( INDEX:: <. ARG1: $B .>
                 /GEN<<  'setind(' $A2  $A1 ',' $W '.sa)'
                                  /) !

                ( SELECTOR:: <. ARG1: $B .>
                  /GEN<< 'if(' $W '.sa==NULL )'
                         'setsel(' $A2 $A1 ',NULL)'
                                         / ) !
                $E1 )  .>   ;;

        ASSGN:: <. op: '!!:='   ,
             praw: $E:= #obqzatelxno_obxekt,
             lew: (( INDEX::<. ARG1:
                               $A1:= #obxekt_ili_NULL,
                           ARG2:
                            $A2:= #INTEGER_ili_obxekt,
                           mesto: $W .>
                 / GEN<<
                    'indxop(' $A2  $A1 ',&' $W '.sa);'
                      'concop(&' $W '.sa,' $E ');'
                 'if(' $W '.sa==NULL )'
                 'setind(' $A2  $A1 ',NULL)'/) !

                (SELECTOR:: <. ARG1: $A1:=
                                       #obxekt_ili_NULL,
                               ARG2: $A2:=
                                     #ACONST_ili_obxekt,
                               mesto: $W .>
                  /GEN<<
                     'selop(' $A2 $A1 ',&' $W '.sa);'
                     'concop(&' $W '.sa,' $E ');'
                     'if(' $W '.sa==NULL )'
                     'setsel(' $A2 $A1 ',NULL)'/) !

                 ( $E1 /#G_wyravenie( $E1);
                        GEN<< 'concop(&' $E1.mesto '.sa,'
                                           $E ')' / ))
                .>      ##

---------------
#G_ALONGTREE

        ASSGN:: <. op: '++:='
                        /GEN<< '/* operator ++:= */'/,
                praw: CONTREE:: <. [ BODY: $B ],
                                   mesto: $REZ  .>,
                lew: ( (INDEX:: <. ARG1: $A1:=
                                #obxekt_ili_NULL,
                                   ARG2: $A2:=
                                #INTEGER_ili_obxekt,
                                   mesto: $W .>
            /GEN<< 'indxop(' $A2 $A1 ',&' $W '.sa);'/ ) !

                        (SELECTOR:: <. ARG1: $A1 :=
                                #obxekt_ili_NULL,
                                       ARG2: $A2:=
                                #ACONST_ili_obxekt,
                                       mesto: $W .>
             /GEN<< 'selop(' $A2 $A1 ',&' $W '.sa);'/ ) !

                        ( $E1 / #G_wyravenie( $E1);
                                $W := $E1.mesto / )  )
                /GEN<< $REZ '=' $W ';'/ ,

        -- 2-j prohod
                praw: <. [ BODY: (. (*
                        $EL := #ACONST_ili_obxekt
                        $EL2 := #obqzatelxno_obxekt
               /GEN<< 'addel(' $EL $EL2 ',&' $W '.sa);' /
                        *) .) ] .>      ,

                lew: ( ( INDEX:: <. ARG1: $B .>
                  /GEN<< 'setind(' $A2 $A1 ',' $W '.sa)' / ) !

                        (SELECTOR:: <. ARG1: $B .>
                  /GEN<< 'if(' $W '.sa==NULL )'
                       'setsel(' $A2 $A1 ',NULL)' / ) !

                        $E1 )  .> ;;

        ASSGN:: <. op: '++:=' ,
                   praw: $E:= #obqzatelxno_obxekt,
                   lew: ( (INDEX::<. ARG1: $A1:=
                                #obxekt_ili_NULL,
                                   ARG2: $A2:=
                                #INTEGER_ili_obxekt,
                                   mesto: $W .>
                /GEN<< 'indxop(' $A2 $A1 ',&' $W '.sa);'
                       'addtre(&' $W '.sa,' $E ');'
                       'if(' $W '.sa==NULL )'
                       'setind(' $A2 $A1 ',NULL)'/ ) !

                          (SELECTOR:: <. ARG1: $A1:=
                                #obxekt_ili_NULL,
                                         ARG2: $A2:=
                                #ACONST_ili_obxekt,
                                         mesto: $W .>
                /GEN<< 'selop(' $A2 $A1 ',&' $W '.sa);'
                       'addtre(&' $W '.sa,' $E ');'
                       'if(' $W '.sa==NULL )'
                       'setsel(' $A2 $A1 ',NULL)'/ ) !

                         ( $E1 /#G_wyravenie( $E1);
                                GEN<<
               'addtre(&' $E1.mesto '.sa,' $E ')' / )
                                ) .>
##
---------------------------------------------------------
-- wspomogatelxnye prawila
------------------------------
#obqzatelxno_obxekt
--    wozwra}aet mesto obxekta w wide
--   (.  LOC I  '.sa'  .)    ili 'NULL'
--       GLOB I
--      WRK I
--
        $E
        / #G_wyravenie( $E); $M:= $E.mesto;
        IF $E.tip -> #G_ATOM_FROM_REZ ($E);
                     RETURN (. $E .mesto2  '.sa' .)
        ELSIF $M = 'NULL' -> RETURN 'NULL'
        ELSIF T ->   RETURN (. $M '.sa' .) FI/
##
-------------------------------------------------------
#obxekt_ili_NULL
--      wozwra}aet mesto obxekta w  wide
--      (. LOC I   '.sa' .)     ili 'NULL'
--         GLOB I
--         WRK I
--
        $E
        / #G_wyravenie( $E); $M:= $E.mesto;
        IF $E.tip OR ($M = 'NULL') -> RETURN 'NULL'
        ELSIF T -> RETURN (. $M '.sa' .) FI/
##
-------------------------------------------------
#INTEGER_ili_obxekt
--      wozwra}aet  (. 0L ',TRUE,' WRK I '.sa,' .)
--      ili         (. N ',FALSE,NULL,'  .)
--
        $E
        /#G_wyravenie( $E);$M:= $E.mesto; $T:= $E.tip;
        IF ($T = ~islo) AND #NUMBER($M) ->
                RETURN #IMPLODE( $M 'L,false,NULL,')
        ELSIF $T = ~islo ->
                RETURN (. $M '.nu,false,NULL,' .)
        ELSIF $T OR ($M ='NULL') ->
                RETURN  '0L,true,NULL,'
        ELSIF T ->  RETURN (. '0L,true,' $M '.sa,' .)
        FI /
##
------------------------------------------------
#ACONST_ili_obxekt
-- wozwra}aet   (. 'ACNST['  N '],false,NULL,'  .)
--  ili         (. '0L,true,' WRK I  '.sa,'  .)
--                           LOC I
--                           GLOB I
--              '0L,true,NULL,'
--
        $E
        /#G_wyravenie( $E); $M:= $E.mesto; $T := $E.tip;
         $A := $E.ACONST;
     IF $A  -> RETURN (. 'acnst[' $A '],false,NULL,' .)
     ELSIF $T -> #G_ATOM_FROM_REZ( $E);
                 RETURN (. '0L,true,' $E.mesto2 '.sa,' .)
     ELSIF $M = 'NULL' -> RETURN '0L,true,NULL,'
     ELSIF T -> RETURN (. '0L,true,' $M '.sa,' .)
     FI /
##
-----------------------------------------------------