Changeset 3667


Ignore:
Timestamp:
Apr 1, 2008, 3:55:54 AM (13 years ago)
Author:
orlov
Message:
  • Advances in T++ generation.
Location:
to-imperative/trunk/compiler/refal/org/refal/plus/compiler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/compiler/refal/org/refal/plus/compiler/rfp_asail_tpp.rf

    r3634 r3667  
    4040$func Expr_Ref_To_CPP s.tvars_box e.ASAIL_Expr_Ref = e.CPP_Expr_Ref;
    4141
     42$func Term_Ref_To_CPP s.tvars e = e;
     43
    4244$func Expr_Int_To_CPP e.ASAIL_Expr_Int = e.CPP_Expr_Int;
    4345
     
    5254$func QName_To_Cpp e.name = e.cpp_name;
    5355
    54 $func Name_To_CPP s.decl_type t.name = e.CPP_Name;
     56$func Name_To_CPP s.decl_type t.name e.args = e.CPP_Name;
    5557
    5658$func Cond_To_CPP t.cond = e.CPP_Cond;
     
    162164      <MapIn &Rfp2Cpp (<Paren e.ress>)> :: e.ress,
    163165      <MapIn &Id 'tout Expr ' (e.ress)> :: e.ress,
     166      <Concat <Intersperse (', ') e.args e.ress>> :: e.args,
    164167      <Extract_Qualifiers t.name> :: (e.qualifiers) e,
    165168      <Namespace_Control e.qualifiers>
    166       ('tfun int '<Name_To_CPP "DECL-FUNC" t.name>' ('<Concat <Intersperse (', ') e.args e.ress>>') {'
     169      ('tfun int '<Name_To_CPP "DECL-FUNC" t.name TFUNC e.args>' ('e.args') {'
    167170        (e.trace_enter <ASAIL_To_CPP e.body> e.trace_exit ('return 0;'))
    168171      '}');
     
    182185          () ();
    183186      } :: (e.trace_enter) (e.trace_exit),
     187      <MapIn &Rfp2Cpp (<Paren e.args> <Paren e.ress>)> :: e.args,
     188      <Concat <Intersperse (', ') <Replicate <Length e.args> ('TExpr&')>>> :: e.proto_args,
     189      <Concat <Intersperse (', ') <MapIn &Id 'TExpr& ' (e.args)>>> :: e.args,
    184190      <Extract_Qualifiers t.name> :: (e.qualifiers) e,
    185191      <Namespace_Control e.qualifiers>
    186       ('RF_FUNC (' <Name_To_CPP "DECL-FUNC" t.name> ', '
    187             <Args_To_CPP ('RF_ARG ') Vars e.args> ', '
    188             <Args_To_CPP ('RF_RES ') Vars e.ress> ')'
    189         (e.trace_enter <ASAIL_To_CPP e.body> e.trace_exit)
    190        'RF_END');
     192//T/      ('RF_FUNC (' <Name_To_CPP "DECL-FUNC" t.name> ', '
     193//T/            <Args_To_CPP ('RF_ARG ') Vars e.args> ', '
     194//T/            <Args_To_CPP ('RF_RES ') Vars e.ress> ')'
     195//T/        (e.trace_enter <ASAIL_To_CPP e.body> e.trace_exit)
     196//T/       'RF_END');
     197      ('int '<Name_To_CPP "DECL-FUNC" t.name FUNC e.proto_args>' ('e.args') {'
     198        (e.trace_enter <ASAIL_To_CPP e.body> e.trace_exit ('return 0;'))
     199      '}');
    191200    (TRACE t.name) =
    192201      <Bind &RFP_Trace (t.name) ()>;
     
    223232        /*empty*/;
    224233      } :: e.trace_exit,
    225       e.trace_exit ('RF_RETFAIL;');
     234      e.trace_exit ('return 1;');
    226235    FATAL =
    227236//      <? &Current-Func> : (e.name),
    228       ('RF_FUNC_ERROR (unexpected_fail);');
     237      ('{' (('TExpr ex;') ('((Expr&)ex).init_str("Unexpected fail", 15);') ('throw ex;')) '}');
     238//T/      ('RF_FUNC_ERROR (unexpected_fail);');
    229239    (LSPLIT e.expr (e.min) t.var1 t.var2) =
    230240      <Box> :: s.tvars,
     
    242252      <Box> :: s.tvars,
    243253      <Expr_Ref_To_CPP s.tvars e.expr> :: e.expr,
    244       <Get s.tvars> (<Rfp2Cpp t.var> ' = 'e.expr';');
     254      <Get s.tvars> (<Rfp2Cpp t.var> ' = (Expr&)'e.expr';');
    245255    (DECL t.var e.expr), t.var : (INT e)  =
    246256      ('int ' <Rfp2Cpp t.var> ' = '<Expr_Int_To_CPP e.expr>';');
    247257    (DECL s.type t.var) =
    248258      ('TExpr ' <Rfp2Cpp t.var> ';');
     259    (DECL s.type t.var (SUBEXPR e.expr (e.pos) (e.len))) =
     260      <Box> :: s.tvars,
     261      <Term_Ref_To_CPP s.tvars (SUBEXPR e.expr (e.pos) (e.len))> : 'TExpr ' e.constr,
     262      ('TExpr '<Rfp2Cpp t.var> e.constr';');
     263    (DECL s.type t.var (DEREF e.expr (e.pos))) =
     264      <Box> :: s.tvars,
     265      ('TExpr '<Rfp2Cpp t.var>' = '
     266        '((Expr&)'<Expr_Ref_To_CPP s.tvars e.expr>')'
     267        '['<Expr_Int_To_CPP e.pos>'].e;');
    249268    (DECL s.type t.var e.expr) =
    250269      <Box> :: s.tvars,
    251270      <Expr_Ref_To_CPP s.tvars e.expr> :: e.expr,
    252       <Get s.tvars> ('Expr ' <Rfp2Cpp t.var> ' ('e.expr');');
     271      <Get s.tvars> ('TExpr ' <Rfp2Cpp t.var> ' ('e.expr');');
    253272    (DROP t.var) =
    254273      (<Rfp2Cpp t.var> '.drop ();');
     
    298317      ('extern Expr ' <Name_To_CPP "DECL-OBJ" t.name> ';');
    299318    ("DECL-FUNC" t.name) =
     319      <Lookup &Decls "DECL-FUNC" t.name> : s.tag e.proto_args,
     320      {
     321        s.tag : TFUNC = 'tfun ';;
     322      } :: e.tfun,
    300323      <Extract_Qualifiers t.name> :: (e.qualifiers) e,
    301324      <Namespace_Control e.qualifiers>
    302       ('RF_DECL (' <Name_To_CPP "DECL-FUNC" t.name> ');');
     325      (e.tfun 'int '<Name_To_CPP "DECL-FUNC" t.name>' ('e.proto_args');');
    303326    (EXTERN t.name) =
    304327      <Bind &Externs (t.name) ()>,
     
    322345//T/          ('RF_' s.call ' (' <Name_To_CPP "DECL-FUNC" t.name> ', '
    323346//T/            <Args_To_CPP () Exprs e.exprs> ', ' <Args_To_CPP () Vars e.ress> ');');
    324         (<Name_To_CPP "DECL-FUNC" t.name>'('
     347        <Concat <Intersperse (', ') <Replicate <Add <Length e.exprs> <Length e.ress>> ('TExpr&')>>> :: e.proto_args,
     348        (<Name_To_CPP "DECL-FUNC" t.name CALL e.proto_args>'('
    325349          <Concat <Intersperse (', ') (<Args_To_CPP () Exprs e.exprs>) <MapIn &Rfp2Cpp (<Paren e.ress>)>>>
    326350        ');');
     
    332356
    333357
    334 $func Term_Ref_To_CPP s.tvars e = e;
    335 
    336358Expr_Ref_To_CPP s.tvars e.expr = e.expr : {
    337359  /*empty*/ = 'empty';
     
    344366    <Expr_Ref_To_CPP s.tvars e.expr> ' ()';
    345367  (DEREF e.expr (e.pos)) =
    346     'Expr (' <Expr_Ref_To_CPP s.tvars e.expr> ', ' <Expr_Int_To_CPP e.pos> ')';
     368    'TExpr (' <Expr_Ref_To_CPP s.tvars e.expr> ', ' <Expr_Int_To_CPP e.pos> ')';
    347369  (SUBEXPR e.expr (e.pos) (e.len)) =
    348     'Expr (' <Expr_Ref_To_CPP s.tvars e.expr> ', '
     370    'TExpr (' <Expr_Ref_To_CPP s.tvars e.expr> ', '
    349371        <Expr_Int_To_CPP e.pos>   ', ' <Expr_Int_To_CPP e.len> ')';
    350372  (REF t.name) = <Name_To_CPP "DECL-OBJ" t.name>;
     
    375397    };
    376398  (LENGTH e.expr) =
    377     <Expr_Ref_To_CPP <Box> e.expr> '.get_len ()';
     399    '((Expr&)'<Expr_Ref_To_CPP <Box> e.expr> ').get_len()';
    378400  (MAX e.args) =
    379401    'pxx_max (' <Args_To_CPP () Ints e.args> ')';
     
    389411Cond_To_CPP {
    390412  ("CALL-FAILS" (CALL t.name (e.exprs) (e.ress))) =
    391     '!RF_CALL (' <Name_To_CPP "DECL-FUNC" t.name> ', '
     413    <Concat <Intersperse (', ') <Replicate <Add <Length e.exprs> <Length e.ress>> ('TExpr&')>>> :: e.proto_args,
     414    '!RF_CALL (' <Name_To_CPP "DECL-FUNC" t.name CALL e.proto_args> ', '
    392415          <Args_To_CPP () Exprs e.exprs> ', '
    393416          <Args_To_CPP () Vars e.ress>   ')';
    394417  ("SYMBOL?" e.expr (e.pos)) =
    395     <Expr_Ref_To_CPP <Box> e.expr> '.symbol_at (' <Expr_Int_To_CPP e.pos> ')';
     418    '((Expr&)'<Expr_Ref_To_CPP <Box> e.expr> ').symbol_at(' <Expr_Int_To_CPP e.pos> ')';
    396419  ("FLAT-SUBEXPR?" e.expr (e.pos) (e.len)) =
    397420    <Expr_Ref_To_CPP <Box> e.expr> '.flat_at ('
     
    403426      <Expr_Ref_To_CPP <Box> e.expr2> ', ' <Expr_Int_To_CPP e.pos> ')';
    404427  ("TERM-EQ" e.expr1 (e.expr2) (e.pos)) =
    405     '((Expr&)'<Term_Ref_To_CPP <Box> e.expr1>')[0] == '
    406     '((Expr&)'<Term_Ref_To_CPP <Box> e.expr2>')['<Expr_Int_To_CPP e.pos>']';
     428    '(((Expr&)'<Term_Ref_To_CPP <Box> e.expr1>')[0] == '
     429     '((Expr&)'<Term_Ref_To_CPP <Box> e.expr2>')['<Expr_Int_To_CPP e.pos>'])';
    407430    //T/ <Expr_Ref_To_CPP <Box> e.expr1> '.term_eq ('
    408431    //T/   <Expr_Ref_To_CPP <Box> e.expr2> ', ' <Expr_Int_To_CPP e.pos> ')';
     
    528551};
    529552
    530 Name_To_CPP s.decl_type (e.name) =
     553Name_To_CPP s.decl_type (e.name) e.args =
    531554  {
    532555    e.name : "org" "refal" "plus" "wrappers" e.cont =
     
    534557      <QName_To_Cpp <Get &Module_Name> <ToWord <Intersperse ('_') e.cont>>>;
    535558    e.name : "refal" "plus" e.cont =
    536       <Bind &Decls (s.decl_type ("refal" e.cont)) ()>,
     559      {
     560        <Lookup &Decls s.decl_type ("refal" e.cont)> : \{ FUNC e; TFUNC e; };
     561        <Bind &Decls (s.decl_type ("refal" e.cont)) (e.args)>;
     562      },
    537563      <QName_To_Cpp "" "refal" e.cont>;
    538564    <Get &Current_Namespace> :: e.namespace,
    539       <Bind &Decls (s.decl_type (e.name)) ()>,
     565      {
     566        <Lookup &Decls s.decl_type (e.name)> : \{ FUNC e; TFUNC e; };
     567        <Bind &Decls (s.decl_type (e.name)) (e.args)>;
     568      },
    540569      {
    541570        e.name : e.namespace e.cont =
  • to-imperative/trunk/compiler/refal/org/refal/plus/compiler/rfp_compile.rf

    r3589 r3667  
    8787
    8888/*
    89  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫
    90  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     89 * Ящик для объявлений статических функций, констант и объектов.  Все они
     90 * выписываются в самом начале тела модуля.
    9191 */
    9292$box Declarations;
     
    684684
    685685/*
    686  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
    687  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫) О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫
    688  * О©╫чёО©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ VAR).
     686 * Обеспечивает, что сгенерированные препроцессорами переменные (с именами,
     687 * оканчивающимися на число) не пересекаются с программными переменными (за
     688 * счёт того, что таг будет VAR). 
    689689 */
    690690Prepare_Vars {
     
    702702
    703703/*
    704  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     704 * Генерируем уникальные внутри модуля имена для функций-заглушек.
    705705 */
    706706Stub_Name (e.qualifiers s.name) =
     
    773773
    774774/*
    775  * О©╫О©╫О©╫О©╫, e.vars -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫
    776  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    777  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫.
    778  * e.splited-Re -- О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
    779  * e.vars О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     775 * Итак, e.vars -- все переменные, входящие в форматное выражение.  Каждая
     776 * переменная может входить в форматное выражение только один раз, поэтому
     777 * повторяющихся среди них нет.
     778 * e.splited-Re -- набор результатных выражений.  На каждую переменную из
     779 * e.vars по выражению, которое должно быть ей присвоено.
    780780 *
    781  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.var_i О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e.Re_j, О©╫ i /= j, О©╫О©╫
    782  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.var_j О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫eО©╫О©╫О©╫О©╫О©╫О©╫
    783  * t.var_i.  О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, t.var_i О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    784  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ t.var_j, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    785  *
    786  * О©╫О©╫О©╫О©╫О©╫О©╫:
     781 * Если переменная t.var_i используется в выражении e.Re_j, и i /= j, то
     782 * переменной t.var_j значение должно быть присвоено раньше, чем перeменной
     783 * t.var_i.  Если же, по аналогичным соображениям, t.var_i должна получить
     784 * значение раньше t.var_j, необходимо завести вспомогательную переменную.
     785 *
     786 * Пример:
    787787 *
    788788 * t1 (t1 t2) (t1 t3) :: t2 t1 t3
     
    793793 * t2 = aux_1;
    794794 *
    795  * О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    796  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫
    797  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
    798  *
    799  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
    800  * О©╫О©╫О©╫О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫".  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫:
     795 * В общем случае вспомогательная переменная требуется, если двум переменным
     796 * необходимы старые значения друг друга (возможно, не напрямую, а через
     797 * промежуточные переменные).
     798 *
     799 * Вместо того, чтобы искать и анализировать такие циклы, будем действовать по
     800 * методу "наибольшей пользы".  А именно:
    801801 *
    802  *   - О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    803  *     её О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    804  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫.
    805  *
    806  *   - О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫
    807  *     О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    808  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    809  *
    810  *   - О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫
    811  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫.О©╫.
    812  *     О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    813  *
    814  *   - О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    815  *     О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
    816  *     О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
    817  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
    818  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    819  *     О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    820  *     О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
    821  *     О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    822  *
    823  *   - О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫сё О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    824  *     О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫её.
    825  *
    826  *
    827  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
     802 *   - Для каждой переменной выпишем все другие переменные, которым требуется
     803 *     её старое значение, а также отдельно те, старые значения которых
     804 *     требуются ей.
     805 *
     806 *   - Всем переменным, от старых значений которых ничего не зависит, можно
     807 *     смело присвоить новые значения.  При этом они исчезают из списков
     808 *     зависимостей оставшихся переменных.
     809 *
     810 *   - Все переменные, новые значения которых ни от чего не зависят, можно
     811 *     отложить, чтобы присвоить им значения тогда, когда будет удобно.  Т.е.
     812 *     тогда, когда списки зависящих от них переменных опустеют.
     813 *
     814 *   - Чтобы означить оставшиеся, нужны вспомогательные переменные.  Выберем
     815 *     одну из переменных, с максимальным списком тех, от которых она зависит,
     816 *     и положим её значение во вспомогательную переменную.  Так как мы сразу
     817 *     уменьшили кол-во зависимостей у максимального кол-ва переменных,
     818 *     локально мы добились наибольшей пользы, хотя не исключено, что глобально
     819 *     такой метод и не даст наименьшего кол-ва вспомогательных переменных.
     820 *     Кроме того, мы не пытаемся выбрать наилучшую переменную из нескольких с
     821 *     максимальным списком зависимостей.
     822 *
     823 *   - Повторяем всё это до тех пор, пока у каждой переменной не опустеет
     824 *     список зависящих от неё.
     825 *
     826 *
     827 * Для нашего примера:
    828828 *
    829829 * t1 (t1 t2) (t1 t3) :: t2 t1 t3
     
    834834 *
    835835 *
    836  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ var_i О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫ j /= i, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ Re_j О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    837  * var_i -- provide[i], О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ j /= i, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ var_j О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
    838  * О©╫О©╫О©╫О©╫чёО©╫О©╫ var_i, О©╫.О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Re_i.
     836 * Для каждой переменной var_i найдём все j /= i, такие что в Re_j встречается
     837 * var_i -- provide[i], и а также все j /= i, такие что var_j нужна для
     838 * подсчёта var_i, т.е. встречается в Re_i.
    839839 *
    840840 * Res-vars <- <Map &Vars (Res)>
     
    884884
    885885/*
    886  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ provide О©╫О©╫О©╫О©╫, её О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    887  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    888  * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ assigns, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ vars, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ provide
    889  * О©╫ delayed.  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ require её О©╫О©╫ О©╫О©╫О©╫О©╫.
     886 * Если есть переменная, у которой список provide пуст, её можно посчитать.
     887 * Это выражается в том, что она (вместе с присваиваемым значением) добавляется
     888 * в список assigns, убирается из списка vars, а также из всех списков provide
     889 * и delayed.  В списках require её не было.
    890890 *
    891891 * CAV Res vars provide require assigns delayed =
    892  *   { i | var_i <- vars, provide_i == [] } ->     // О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫!  О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    893  *                                                    О©╫О©╫ delayed О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     892 *   { i | var_i <- vars, provide_i == [] } ->     // Здесь неверно!  На переменные
     893 *                                                    из delayed тоже надо смотреть.
    894894 *       vars    = vars - var_i
    895895 *       provide = [ provide_j - i | provide_j <- provide ]
     
    915915
    916916/*
    917  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ require О©╫О©╫О©╫О©╫, О©╫О©╫О©╫дёО©╫ её О©╫ delayed.
    918  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ provide, О©╫.О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
    919  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ require.
     917 * Если есть переменная, у которой список require пуст, кладём её в delayed.
     918 * Она будет посчитана, когда у неё опустеет список provide, т.е. когда не
     919 * останется переменных, у которых она в списке require.
    920920 */
    921921$func Delay_Empty_Requires e.vars  = e.delayed (e.vars);
     
    930930
    931931/*
    932  * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫ О©╫О©╫О©╫О©╫) О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     932 * Выбор переменной (из двух) с более длинным списком требуемых ей значений.
    933933 */
    934934$func Max_Require e = e;
     
    944944
    945945/*
    946  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    947  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
    948  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     946 * Подставить вспомогательную переменную вместо исходной во всех результатных выражениях.
     947 * Присваивание к исходной переменной убрать (оно к этому моменту уже выполнено).
     948 * Убрать переменную из списков зависимостей.
    949949 */
    950950$func Subst_Aux_Var e = e;
     
    962962
    963963/*
    964  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     964 * Извлечь присваивание из всей информации о переменной.
    965965 */
    966966$func Extract_Assigns e = e;
     
    969969
    970970/*
    971  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    972  *
    973  * 1) О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫), О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
    974  *    О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    975  * 2) О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    976  * 3) О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫,
    977  *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
    978  *    О©╫её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ 1.
     971 * Основной цикл обработки присваиваний.
     972 *
     973 * 1) Из всех переменных (в том числе и отложенных), от которых больше ничего
     974 *    не зависит, сделать присваивания.
     975 * 2) Все переменные, которые больше ни от чего не зависят, отложить.
     976 * 3) Если осталось хотя бы две неотложенных переменных, выбирать из них ту,
     977 *    которая зависит от наибольшего числа переменных, подставить везде вместо
     978 *    неё вспомогательную, перейти к пункту 1.
    979979 */
    980980CAV e.vars (e.assigns) (e.delayed) =
     
    996996
    997997
    998 //***************** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ *******************
     998//***************** Компиляция сопоставления с образцом *******************
    999999
    10001000Get_Clash_Sequence (e.last_Re) t.Pattern e.Snt =
     
    10021002    e.Snt : (RESULT e.Re) (s.dir e.Pe) e.rest =
    10031003      /*
    1004        * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
    1005        * О©╫О©╫О©╫О©╫О©╫О©╫дёО©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
    1006        * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     1004       * Компилируем все константные выражения и заводим в табличке все
     1005       * незаведённые переменные.  У старых переменных очищается память
     1006       * на предмет клешей, в которых они раньше использовались.
    10071007       */
    10081008      <Prepare_Res (e.Re) (e.Pe)> : (e.R1) (e.P1),
     
    10591059    <CC_Unknown_Lengths t.end_cycle e.clashes> :: e.conds,
    10601060    /*
    1061      * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
    1062      * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫
    1063      * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫дёО©╫ О©╫О©╫ О©╫
    1064      * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    1065      * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.end-cycle О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    1066      * О©╫О©╫О©╫О©╫О©╫.
     1061     * Когда мы добрались до сюда, все условия на длины на текущем уровне
     1062     * выписаны.  Невыполнение любого из оставшихся условий (на
     1063     * соответствие типов, равенство, длины внутри скобок) ведёт не к
     1064     * прекращению текущего цикла, а переход к его следующей итерации.
     1065     * Поэтому в качестве t.end-cycle везде дальше подставляется текущий
     1066     * откат.
    10671067     */
    10681068    <Update_Hard_Parts> : {
     
    12081208
    12091209/*
    1210  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    1211  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ ASAIL.
     1210 * Информацию о проверках и заведении переменных, необходимых для создания
     1211 * клешей из содержимого скобок, кодируем на ASAIL.
    12121212 */
    12131213CC_Deref (e.fail) e.actions, e.actions : {
     
    12511251        {
    12521252          /*
    1253            * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e.eqs О©╫О©╫О©╫ e.Re
    1254            * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     1253           * Мы предполагаем, что во всех пришедших e.eqs все e.Re
     1254           * уже были определены ранее.
    12551255           */
    1256           e.assigns : $r e1 (s.op t.Pt e.def) e2 =
    1257             <CC_Eqs (e.fail) (e1 (s.op t.Pt e.def) t.cond e2) e.rest>;
     1256          e.assigns : $r e1 (s.op e.arg t.Pt e.def) e2, e.arg : \{ s; /*empty*/; } =
     1257            <CC_Eqs (e.fail) (e1 (s.op e.arg t.Pt e.def) t.cond e2) e.rest>;
    12581258          t.cond <CC_Eqs (e.fail) (e.assigns) e.rest>;
    12591259        };
     
    12731273          <Vars_Decl Expr t.Pt> : e,
    12741274            e.cond <CC_Eqs (e.fail) (e.assigns
    1275               (DECL Expr t.Pt) (ASSIGN t.Pt (SUBEXPR e.Re (e.pos) (e.len)))) e.rest>;
     1275              //(DECL Expr t.Pt) (ASSIGN t.Pt (SUBEXPR e.Re (e.pos) (e.len)))) e.rest>;
     1276              (DECL Expr t.Pt (SUBEXPR e.Re (e.pos) (e.len)))) e.rest>;
    12761277        };
    12771278    };
Note: See TracChangeset for help on using the changeset viewer.