Changeset 3589


Ignore:
Timestamp:
Mar 28, 2008, 5:33:14 PM (13 years ago)
Author:
yura
Message:
  • Compiler files are moved into package org.refal.plus.compiler.
Location:
to-imperative/trunk/compiler/src/org
Files:
4 added
40 copied

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/NativeJava.rfi

    r3580 r3589  
    1 /* s.returnType s.methodName : empty  --  constructor */
    2 /* e.argTypes : empty  --  field */
    3 /* e.argTypes : (e)    --  method */
     1// $Id$
     2
    43$func DeclarationReader s.decl = s.isStatic s.returnType s.className s.methodName e.argTypes;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_as2as.rf

    r3580 r3589  
    1 // $Id$
    2 
    3 $use "rfpc";
    4 $use "rfp_compile";
    5 $use "rfp_format";
    6 $use "rfp_helper";
    7 $use "rfp_vars";
    8 $use "rfp_debug";
     1$use "org.refal.plus.compiler.rfpc";
     2$use "org.refal.plus.compiler.rfp_compile";
     3$use "org.refal.plus.compiler.rfp_format";
     4$use "org.refal.plus.compiler.rfp_helper";
     5$use "org.refal.plus.compiler.rfp_vars";
     6$use "org.refal.plus.compiler.rfp_debug";
    97
    108$use Arithm Box Class List StdIO Table;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_as2as.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func RFP_As2As_Transform e.Items = e.Items;
    6 
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$func Op (e.op) e.args = e.asail_op;
    42
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail2asail.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Apply Arithm Box Class Compare List StdIO Table;
    42
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail_cpp.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    51$use Apply Arithm Box Class Compare Convert CppMangle List StdIO Table;
    6 $use "rfpc";
    7 $use "rfp_helper";
    8 $use "rfp_vars";
     2
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_helper";
     5$use "org.refal.plus.compiler.rfp_vars";
    96
    107$box Int;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail_cpp.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func RFP_ASAIL_To_CPP t.asail_module = e.cpp;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail_java.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Access Apply Arithm Box Class Compare Convert JavaMangle List StdIO Table;
    4 $use "rfpc";
    5 $use "rfp_helper";
    6 $use "rfp_vars";
    7 $use NativeJava;
     2
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_helper";
     5$use "org.refal.plus.compiler.rfp_vars";
     6$use "org.refal.plus.compiler.NativeJava";
    87
    98$box Int;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail_java.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func RFP_ASAIL_To_Java t.asail_module = (e.javaModuleName) (e.module);
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_asail_jbc.rf

    r3580 r3589  
    1 // $Id$
    2 // vim: set et ts=2 sw=2 :
    3 
    41$use Access Apply Arithm Box Class Compare Convert File JavaMangle List StdIO Table Java;
    5 $use "rfpc";
    6 $use "rfp_helper";
    7 $use "rfp_vars";
    8 $use NativeJava;
     2
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_helper";
     5$use "org.refal.plus.compiler.rfp_vars";
     6$use "org.refal.plus.compiler.NativeJava";
    97
    108//$use "org.refal.plus.wrappers.org.objectweb.asm.AnnotationVisitor";
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_check.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    51$use Access Arithm Box Compare Convert List StdIO Table;
    62
    7 $use "rfpc";
    8 $use "rfp_err";
    9 $use "rfp_format";
    10 $use "rfp_helper";
    11 $use "rfp_vars";
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_err";
     5$use "org.refal.plus.compiler.rfp_format";
     6$use "org.refal.plus.compiler.rfp_helper";
     7$use "org.refal.plus.compiler.rfp_vars";
    128
    139// verifies that all constructions in e.Sentence have right formats
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_check.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func RFP_Check e.Items = ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_clashes.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    5 
    61//***********************************  ************************************
    7 //*********** Упорядоченное хранилище клешей и операции с ним *************
     2//*********** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ *************
    83
    94$use Access Apply Arithm Box Compare List StdIO Table;
    105
    11 $use "rfp_asail";
    12 $use "rfp_const";
    13 $use "rfp_vars";
    14 $use "rfp_helper";
    15 
    16 
    17 /*
    18  * Собственно, хранилище.
     6$use "org.refal.plus.compiler.rfp_asail";
     7$use "org.refal.plus.compiler.rfp_const";
     8$use "org.refal.plus.compiler.rfp_vars";
     9$use "org.refal.plus.compiler.rfp_helper";
     10
     11
     12/*
     13 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    1914 */
    2015$box Clashes;
    2116/*
    22  * Хранятся в нём клеши в следующем формате:
     17 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ нёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    2318 *
    2419 * t.clash ::= (s.idx (e.Re) (s.dir e.Pe) e.boxes)
    2520 *
    26  * e.boxes -- список ящиков, обозначающих свойства данного клеша.  В этих
    27  * ящиках находятся номера клешей, обладающих заданным свойством и, возможно,
    28  * некая дополнительная информация для каждого клеша.
     21 * e.boxes -- О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫О©╫О©╫
     22 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     23 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
    2924 *
    3025 *
    31  * Ящики бывают следующие.
     26 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    3227 *
    3328 */
     
    3530
    3631/*
    37  * Образец может иметь жёсткие по длине части слева и справа.  Сопоставление с
    38  * этими частями выливается в проверку условий возможности такого сопоставления
    39  * и заведение новых переменных.  Всё это делается до компиляции циклической
    40  * части образца.
     32 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     33 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     34 * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫сё О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     35 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    4136 *
    42  * В результате означивания новых переменных, жёсткие части образца могут
    43  * удлинняться.  Следующая таблица по индексу клеша хранит запись вида:
     37 * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     38 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫:
    4439 * (e.left) (e.right) expr.
    45  * e.left  -- выражение, в ран-тайм получающее значение длины жёсткой части
    46  * слева.
    47  * e.right -- аналогичное выражение для длины жёсткой части справа.
    48  * expr    -- часть выражения между жёсткими кусками.
     40 * e.left  -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     41 * О©╫О©╫О©╫О©╫О©╫.
     42 * e.right -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     43 * expr    -- О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    4944 */
    5045$table Hard_Parts;
     
    8883  {
    8984    /*
    90      * Если длины всех переменных на верхних уровнях e.Re и e.Pe
    91      * известны, кладём клеш в ящик &Known-Lengths.
     85     * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e.Re О©╫ e.Pe
     86     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ &Known-Lengths.
    9287     */
    9388    e.vars_Re : /*empty*/, e.vars_Pe : /*empty*/ =
     
    9590      &Known_Lengths;
    9691    /*
    97      * Если на верхнем уровне во всём клеше ровно одна переменная с
    98      * неизвестной длинной, и она входит в левую и правую части разное
    99      * кол-во раз, то её длину можно вычислить.
    100      * В каждой переменной делаем пометку, что она используется в этом клеше.
    101      * Кладём клеш в ящик &Compute-Length.
     92     * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫сёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     93     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     94     * О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     95     * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     96     * О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ &Compute-Length.
    10297     */
    10398    <Arithm.Sub <Length e.vars_Re> <Length e.vars_Pe>> :: s.diff,
     
    112107      &Compute_Length;
    113108    /*
    114      * В оставшихся случаях, всё, что мы можем сделать -- выписать
    115      * граничные условия и ждать, пока не появится новой информации о длине
    116      * каких-либо переменных.
    117      * В каждой переменной делаем пометку, что она используется в этом клеше.
    118      * Кладём клеш в таблицу &Unknown-Lengths.
     109     * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫сё, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     110     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫
     111     * О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     112     * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     113     * О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &Unknown-Lengths.
    119114     */
    120115    <Compute_Bounds s.idx (e.len_Re) (e.vars_Re) (e.len_Pe) (e.vars_Pe)>,
     
    159154    <Store &Clashes e1 (s.idx (e.Re) (s.dir e.Pe) e.boxes1 e.boxes2) e2>;
    160155  /*
    161    * Может оказаться, что клеша с номером s.idx уже нет в хранилище -- из памяти
    162    * переменных клеши не удаляются.  В этом случае просто не надо ничего делать.
     156   * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ s.idx О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     157   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
    163158   */
    164159  ;
     
    167162
    168163
    169 //********************* Индекс для нумерации клешей ***********************
     164//********************* О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ ***********************
    170165
    171166$box FreeIdx;
     
    180175
    181176
    182 //**************************** Инициализация ******************************
     177//**************************** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ******************************
    183178
    184179$func Compose_Clashes e.clashes = e.clashes;
     
    222217
    223218
    224 //****** Обновление информации о жёстких началах и концах образцов ********
     219//****** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ********
    225220
    226221$func UHP (e.conds) (e.assigns) e.clashes = e.clashes (e.actions);
     
    230225
    231226/*
    232  * Просматриваем все имеющиеся клеши.
    233  * Если в результате новой информации о переменных, входящих в образец, можно
    234  * утверждать что жёсткие части удлиннились, запоминаем эту информацию в
    235  * таблице &Hard-Parts, заводим новые клеши, получающиеся из скобок в образце,
    236  * и возвращаем условия и присваивания, нужные, чтобы завести эти клеши.
    237  * Новые, входящие в жёсткие, части образца, не являющиеся скобками, кладутся в
    238  * ящик &Eqs вместе с результатным выражением и с позицией в этом выражении с
    239  * которой надо эти части сопоставлять.
     227 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     228 * О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫
     229 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     230 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &Hard-Parts, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     231 * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     232 * О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ жёО©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     233 * О©╫О©╫О©╫О©╫ &Eqs О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     234 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    240235 */
    241236Update_Hard_Parts =
     
    268263
    269264/*
    270  * Функция, занимающаяся непосредственно проверкой составляющих образца на
    271  * вычислимость длин, начиная слева или справа, в зависимости от s.dir.
     265 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     266 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ s.dir.
    272267 *
    273  * Если очередной терм -- это скобки, то должен быть заведён новый клеш,
    274  * образованный из содержимого скобок.  Перед этим надо произвести проверку на
    275  * то, что в результатном выражении в этом месте тоже стоят скобки, и завести
    276  * переменную, обозначающую их содержимое.
    277  * Данная функция возвращает всю информацию, необходимую для этих действий.
     268 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫,
     269 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     270 * О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     271 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     272 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    278273 */
    279274UHP_Clash s.dir s.fun s.l s.r (e.conds) (e.assigns) (e.pos) (e.Re) e.Pe, {
     
    420415
    421416/*
    422  * Из верхнего уровня выражения изымаются все переменные, длина которых не
    423  * может быть посчитана (она неизвестна из формата, и переменная ещё не
    424  * получила значение в run-time).  Список этих переменных возвращается вторым
    425  * параметром.  Первым параметром возвращается длина оставшегося после их
    426  * изъятия выражения.
     417 * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     418 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫
     419 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ run-time).  О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     420 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     421 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    427422 */
    428423Get_Known_Length e.Re =
    429424  e.Re (/*e.length*/) (/*e.unknown-vars*/) $iter {
    430425    e.Re : t.Rt e.rest, t.Rt : {
    431       s.ObjectSymbol = 1 ();    // Может появиться из константы.
     426      s.ObjectSymbol = 1 ();    // О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    432427      (PAREN e) = 1 ();
    433428      (FUNC e) = 1 ();
     
    448443  };
    449444
    450 $table Const_Len;  // Fixme: инициализировать когда?
     445$table Const_Len;  // Fixme: О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫?
    451446
    452447Ref_Len t.name = {
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_clashes.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$table Known_Lengths;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_compile.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    5 $use "rfpc";
    6 $use "rfp_helper";
    7 $use "rfp_check";
    8 $use "rfp_as2as";
    9 $use "rfp_format";
    10 $use "rfp_vars";
    11 $use "rfp_const";
    12 $use "rfp_clashes";
    13 
    14 $use StdIO;
    15 $use Table;
    16 $use Box;
    17 $use Arithm;
    18 $use Access;
    19 $use Compare;
    20 $use Convert;
    21 $use Class;
    22 $use Apply;
    23 $use Dos;
    24 $use List;
    25 
     1$use Access Apply Arithm Box Class Compare Convert Dos List StdIO Table;
     2
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_helper";
     5$use "org.refal.plus.compiler.rfp_check";
     6$use "org.refal.plus.compiler.rfp_as2as";
     7$use "org.refal.plus.compiler.rfp_format";
     8$use "org.refal.plus.compiler.rfp_vars";
     9$use "org.refal.plus.compiler.rfp_const";
     10$use "org.refal.plus.compiler.rfp_clashes";
    2611
    2712/*
     
    10287
    10388/*
    104  * Ящик для объявлений статических функций, констант и объектов.  Все они
    105  * выписываются в самом начале тела модуля.
     89 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫
     90 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
    10691 */
    10792$box Declarations;
     
    699684
    700685/*
    701  * Обеспечивает, что сгенерированные препроцессорами переменные (с именами,
    702  * оканчивающимися на число) не пересекаются с программными переменными (за
    703  * счёт того, что таг будет VAR).
     686 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     687 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫) О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫
     688 * О©╫чёО©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ VAR).
    704689 */
    705690Prepare_Vars {
     
    717702
    718703/*
    719  * Генерируем уникальные внутри модуля имена для функций-заглушек.
     704 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    720705 */
    721706Stub_Name (e.qualifiers s.name) =
     
    788773
    789774/*
    790  * Итак, e.vars -- все переменные, входящие в форматное выражение.  Каждая
    791  * переменная может входить в форматное выражение только один раз, поэтому
    792  * повторяющихся среди них нет.
    793  * e.splited-Re -- набор результатных выражений.  На каждую переменную из
    794  * e.vars по выражению, которое должно быть ей присвоено.
     775 * О©╫О©╫О©╫О©╫, e.vars -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫
     776 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     777 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫.
     778 * e.splited-Re -- О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     779 * e.vars О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    795780 *
    796  * Если переменная t.var_i используется в выражении e.Re_j, и i /= j, то
    797  * переменной t.var_j значение должно быть присвоено раньше, чем перeменной
    798  * t.var_i.  Если же, по аналогичным соображениям, t.var_i должна получить
    799  * значение раньше t.var_j, необходимо завести вспомогательную переменную.
    800  *
    801  * Пример:
     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 * О©╫О©╫О©╫О©╫О©╫О©╫:
    802787 *
    803788 * t1 (t1 t2) (t1 t3) :: t2 t1 t3
     
    808793 * t2 = aux_1;
    809794 *
    810  * В общем случае вспомогательная переменная требуется, если двум переменным
    811  * необходимы старые значения друг друга (возможно, не напрямую, а через
    812  * промежуточные переменные).
    813  *
    814  * Вместо того, чтобы искать и анализировать такие циклы, будем действовать по
    815  * методу "наибольшей пользы".  А именно:
     795 * О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     796 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫
     797 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
     798 *
     799 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     800 * О©╫О©╫О©╫О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫".  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫:
    816801 *
    817  *   - Для каждой переменной выпишем все другие переменные, которым требуется
    818  *     её старое значение, а также отдельно те, старые значения которых
    819  *     требуются ей.
    820  *
    821  *   - Всем переменным, от старых значений которых ничего не зависит, можно
    822  *     смело присвоить новые значения.  При этом они исчезают из списков
    823  *     зависимостей оставшихся переменных.
    824  *
    825  *   - Все переменные, новые значения которых ни от чего не зависят, можно
    826  *     отложить, чтобы присвоить им значения тогда, когда будет удобно.  Т.е.
    827  *     тогда, когда списки зависящих от них переменных опустеют.
    828  *
    829  *   - Чтобы означить оставшиеся, нужны вспомогательные переменные.  Выберем
    830  *     одну из переменных, с максимальным списком тех, от которых она зависит,
    831  *     и положим её значение во вспомогательную переменную.  Так как мы сразу
    832  *     уменьшили кол-во зависимостей у максимального кол-ва переменных,
    833  *     локально мы добились наибольшей пользы, хотя не исключено, что глобально
    834  *     такой метод и не даст наименьшего кол-ва вспомогательных переменных.
    835  *     Кроме того, мы не пытаемся выбрать наилучшую переменную из нескольких с
    836  *     максимальным списком зависимостей.
    837  *
    838  *   - Повторяем всё это до тех пор, пока у каждой переменной не опустеет
    839  *     список зависящих от неё.
    840  *
    841  *
    842  * Для нашего примера:
     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 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    843828 *
    844829 * t1 (t1 t2) (t1 t3) :: t2 t1 t3
     
    849834 *
    850835 *
    851  * Для каждой переменной var_i найдём все j /= i, такие что в Re_j встречается
    852  * var_i -- provide[i], и а также все j /= i, такие что var_j нужна для
    853  * подсчёта 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.
    854839 *
    855840 * Res-vars <- <Map &Vars (Res)>
     
    899884
    900885/*
    901  * Если есть переменная, у которой список provide пуст, её можно посчитать.
    902  * Это выражается в том, что она (вместе с присваиваемым значением) добавляется
    903  * в список assigns, убирается из списка vars, а также из всех списков provide
    904  * и delayed.  В списках require её не было.
     886 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ provide О©╫О©╫О©╫О©╫, её О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     887 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     888 * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ assigns, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ vars, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ provide
     889 * О©╫ delayed.  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ require её О©╫О©╫ О©╫О©╫О©╫О©╫.
    905890 *
    906891 * CAV Res vars provide require assigns delayed =
    907  *   { i | var_i <- vars, provide_i == [] } ->     // Здесь неверно!  На переменные
    908  *                                                    из delayed тоже надо смотреть.
     892 *   { i | var_i <- vars, provide_i == [] } ->     // О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫!  О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     893 *                                                    О©╫О©╫ delayed О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    909894 *       vars    = vars - var_i
    910895 *       provide = [ provide_j - i | provide_j <- provide ]
     
    930915
    931916/*
    932  * Если есть переменная, у которой список require пуст, кладём её в delayed.
    933  * Она будет посчитана, когда у неё опустеет список provide, т.е. когда не
    934  * останется переменных, у которых она в списке require.
     917 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ require О©╫О©╫О©╫О©╫, О©╫О©╫О©╫дёО©╫ её О©╫ delayed.
     918 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ provide, О©╫.О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     919 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ require.
    935920 */
    936921$func Delay_Empty_Requires e.vars  = e.delayed (e.vars);
     
    945930
    946931/*
    947  * Выбор переменной (из двух) с более длинным списком требуемых ей значений.
     932 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫ О©╫О©╫О©╫О©╫) О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    948933 */
    949934$func Max_Require e = e;
     
    959944
    960945/*
    961  * Подставить вспомогательную переменную вместо исходной во всех результатных выражениях.
    962  * Присваивание к исходной переменной убрать (оно к этому моменту уже выполнено).
    963  * Убрать переменную из списков зависимостей.
     946 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     947 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
     948 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    964949 */
    965950$func Subst_Aux_Var e = e;
     
    977962
    978963/*
    979  * Извлечь присваивание из всей информации о переменной.
     964 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    980965 */
    981966$func Extract_Assigns e = e;
     
    984969
    985970/*
    986  * Основной цикл обработки присваиваний.
    987  *
    988  * 1) Из всех переменных (в том числе и отложенных), от которых больше ничего
    989  *    не зависит, сделать присваивания.
    990  * 2) Все переменные, которые больше ни от чего не зависят, отложить.
    991  * 3) Если осталось хотя бы две неотложенных переменных, выбирать из них ту,
    992  *    которая зависит от наибольшего числа переменных, подставить везде вместо
    993  *    неё вспомогательную, перейти к пункту 1.
     971 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     972 *
     973 * 1) О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫), О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     974 *    О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     975 * 2) О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     976 * 3) О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫,
     977 *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     978 *    О©╫её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ 1.
    994979 */
    995980CAV e.vars (e.assigns) (e.delayed) =
     
    1011996
    1012997
    1013 //***************** Компиляция сопоставления с образцом *******************
     998//***************** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ *******************
    1014999
    10151000Get_Clash_Sequence (e.last_Re) t.Pattern e.Snt =
     
    10171002    e.Snt : (RESULT e.Re) (s.dir e.Pe) e.rest =
    10181003      /*
    1019        * Компилируем все константные выражения и заводим в табличке все
    1020        * незаведённые переменные.  У старых переменных очищается память
    1021        * на предмет клешей, в которых они раньше использовались.
     1004       * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     1005       * О©╫О©╫О©╫О©╫О©╫О©╫дёО©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     1006       * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    10221007       */
    10231008      <Prepare_Res (e.Re) (e.Pe)> : (e.R1) (e.P1),
     
    10741059    <CC_Unknown_Lengths t.end_cycle e.clashes> :: e.conds,
    10751060    /*
    1076      * Когда мы добрались до сюда, все условия на длины на текущем уровне
    1077      * выписаны.  Невыполнение любого из оставшихся условий (на
    1078      * соответствие типов, равенство, длины внутри скобок) ведёт не к
    1079      * прекращению текущего цикла, а переход к его следующей итерации.
    1080      * Поэтому в качестве t.end-cycle везде дальше подставляется текущий
    1081      * откат.
     1061     * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     1062     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫
     1063     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫дёО©╫ О©╫О©╫ О©╫
     1064     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     1065     * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.end-cycle О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     1066     * О©╫О©╫О©╫О©╫О©╫.
    10821067     */
    10831068    <Update_Hard_Parts> : {
     
    12231208
    12241209/*
    1225  * Информацию о проверках и заведении переменных, необходимых для создания
    1226  * клешей из содержимого скобок, кодируем на ASAIL.
     1210 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     1211 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ ASAIL.
    12271212 */
    12281213CC_Deref (e.fail) e.actions, e.actions : {
     
    12661251        {
    12671252          /*
    1268            * Мы предполагаем, что во всех пришедших e.eqs все e.Re
    1269            * уже были определены ранее.
     1253           * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e.eqs О©╫О©╫О©╫ e.Re
     1254           * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
    12701255           */
    12711256          e.assigns : $r e1 (s.op t.Pt e.def) e2 =
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_compile.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func RFP_Compile t.ModuleName e.items = t.asail_module;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_const.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    51$use Access Arithm Box List StdIO Table;
    62
    7 
    8 /*
    9  * Во время компиляции каждого модуля все статические константые выражения
    10  * складываются в ящик
     3/*
     4 * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     5 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫
    116 */
    127$box Static;
    138/*
    14  * Каждое выражение представлено термом вида (t.name expr).
     9 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ (t.name expr).
    1510 */
    1611
     
    4035
    4136/*
    42  * Накопленные в процессе компиляции модуля константные выражения лежат в
    43  * &Static.  Теперь необходимо отобразить их в CONSTEXPR из ASAIL.
    44  * Эта форма имеет следующий синтаксис:
     37 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫
     38 * &Static.  О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫ CONSTEXPR О©╫О©╫ ASAIL.
     39 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    4540 *
    4641 * t.const         ::= (CONSTEXPR s.linkage t.name (e.comment) e.const-expr)
     
    5550 * s.pos, s.len    ::= [int]
    5651 *
    57  * e.comment содержит выражение в том виде, в котором оно встретилось в
    58  * Рефал-программе.  Может быть полезным для получения более читабельной
    59  * программы на императивном языке.
    60  *
    61  * REF -- ссылка на $const'анту или объект.
    62  *
    63  * STATIC -- обозначение константного статического выражения.
    64  *
    65  *
    66  * Выражения из &Static должны создаваться после того, как объявлены все
    67  * функции, объекты и константы, потому что могут ссылаться на них.
    68  * Они также ссылаются друг на друга, с целью минимизации ресурсов, требуемых
    69  * на их хранение.  Если выражение встречается как подвыражение в другом, то
    70  * оно должно являться просто ссылкой.  Несколько примеров того, как надо
    71  * заводить константы с учётом этого правила:
    72  *
    73  * 1. ABCD, ABC            --> ABC должно заводиться после ABCD, как подвыражение.
    74  *
    75  * 2. A(BCD)E, BC          --> BCD, затем A(BCD)E, затем BC, как подвыражение BCD.
    76  *
    77  * 3. A(BC(DE)FG)H, E      --> DE, затем A(BC(DE)FG)H, затем E.
    78  *
    79  * 4. A(BC(DE)FG)H, C(DE)F --> BC(DE)FG, затем A(BC(DE)FG)H, затем C(DE)F.
    80  *
    81  * 5. (AB)(ABC)(BC)        --> ABC, затем (AB)(ABC)(BC), причём AB и BC -- ссылки на ABC.
    82  *
    83  *
    84  * Итак, если из двух имеющихся выражений одно является подвыражением другого,
    85  * то первым делом заводится минимальное выражение в скобках, содержащее
    86  * подвыражение, а искомые выражения получаются из него либо операцией SUBEXPR,
    87  * либо одеванием скобок и конкатенацией.
    88  *
    89  * Для каждого подвыражения в скобках: если оно является подвыражением верхнего
    90  * уровня какого-нибудь другого выражения или подвыражения в скобках, то
    91  * сначала заводится выражение, содержащее его на верхнем уровне.
    92  *
    93  *
    94  * Обеспечивать такую схему будем в два приёма.  Сначала выпишем все выражения,
    95  * которые необходимо завести, а затем определим порядок их заведения,
    96  * удовлетворяющий зависимостям между ними.
    97  *
    98  * На первом шаге все статические выражения, и все их подвыражения в скобках
    99  * выписываются в табличку
     52 * e.comment О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     53 * О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     54 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     55 *
     56 * REF -- О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ $const'О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     57 *
     58 * STATIC -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     59 *
     60 *
     61 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     62 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫.
     63 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     64 * О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
     65 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
     66 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫чёО©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
     67 *
     68 * 1. ABCD, ABC            --> ABC О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ ABCD, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     69 *
     70 * 2. A(BCD)E, BC          --> BCD, О©╫О©╫О©╫О©╫О©╫ A(BCD)E, О©╫О©╫О©╫О©╫О©╫ BC, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ BCD.
     71 *
     72 * 3. A(BC(DE)FG)H, E      --> DE, О©╫О©╫О©╫О©╫О©╫ A(BC(DE)FG)H, О©╫О©╫О©╫О©╫О©╫ E.
     73 *
     74 * 4. A(BC(DE)FG)H, C(DE)F --> BC(DE)FG, О©╫О©╫О©╫О©╫О©╫ A(BC(DE)FG)H, О©╫О©╫О©╫О©╫О©╫ C(DE)F.
     75 *
     76 * 5. (AB)(ABC)(BC)        --> ABC, О©╫О©╫О©╫О©╫О©╫ (AB)(ABC)(BC), О©╫О©╫О©╫чёО©╫ AB О©╫ BC -- О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ ABC.
     77 *
     78 *
     79 * О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     80 * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     81 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ SUBEXPR,
     82 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     83 *
     84 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫: О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     85 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
     86 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     87 *
     88 *
     89 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫иёО©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     90 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     91 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
     92 *
     93 * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     94 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    10095 */
    10196$table St_Table;
    10297/*
    103  * Ключами являются сами выражения.  Значения имеют следующий вид:
     98 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫:
    10499 *
    105100 * e.value ::= t.expr-name (e.context) (e.position)
     
    108103 * e.position ::= [empty] | s.pos s.len expr
    109104 *
    110  * Пустое имя означает, что это выражение вспомогательное, нужное для
    111  * обеспечения выше приведённых правил, и нормальное имя для него будет
    112  * необходимо сгенерировать в случае, если его действительно потребуется
    113  * завести.
    114  *
    115  * e.context -- это уровень в объемлющем выражении, содержащий наше.  Например,
    116  * если наше выражение -- это A B, входящее в X (Y (A B) (Z (Z))) X, то
    117  * контекстом будет Y (A B) (Z (Z)).  Это поле нужно для определения выражений,
    118  * которые всегда используются в одном и том же контексте и, следовательно, не
    119  * требуют заведения.  Пустой контекст означает, что выражение используется в
    120  * разных ситуациях.  Выражение необходимо завести тогда и только тогда, когда
    121  * контекст пуст.
    122  *
    123  * e.position -- это координаты для тех выражений, которые являются
    124  * подвыражениями каких-либо других.  Такие выражения необходимо заводить после
    125  * тех, на которые они ссылаются.
     105 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     106 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫дёО©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     107 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     108 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     109 *
     110 * e.context -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     111 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫ A B, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ X (Y (A B) (Z (Z))) X, О©╫О©╫
     112 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ Y (A B) (Z (Z)).  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     113 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
     114 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     115 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫
     116 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
     117 *
     118 * e.position -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     119 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     120 * О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    126121 *
    127122 *
    128  * Опишем рекурсивный алгоритм раскладывания очередного выражения по табличке.
     123 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    129124 */
    130125$func Bind_Subexprs s.Isnew t.expr_name (e.context) (e.current) expr = s.Isnew;
    131126/*
    132  * Будем искать подвыражения среди уже имеющихся в табличке, начиная с самых
    133  * глубоких.  Если на каком-то уровне окажется, что такого подвыражения в
    134  * табличке ещё не было (оно новое), значит там нет и никакого подвыражения
    135  * более высокого уровня.  Эту информацию будем хранить в s.new?, и она поможет
    136  * нам сэкономить на просмотрах имеющейся таблицы.
    137  *
    138  * Если s.new? есть Old, значит есть вероятность, что текущее выражение в
    139  * табличке уже имеется.  Если New, значит текущее выражение новое, в табличке
    140  * его точно нет.
    141  *
    142  * Возвращает функция также флаг s.new?, показывающий удалось ли найти текущий
    143  * уровень в табличке, и надо ли, соответственно, искать там следующий уровень.
    144  *
    145  * e.context -- контекст текущего уровня.
    146  *
    147  * e.current -- текущий уровень.
    148  *
    149  * expr -- остаток текущего уровня, который надо просмотреть на предмет
    150  * подвыражений.
    151  *
    152  * Для проверки того, что выражение e1 является подвыражением в скобках для
    153  * выражения e2 (откуда следует, что e1 не может быть заведено после e2), далее
    154  * используется функция
     127 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫
     128 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     129 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫ О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫), О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     130 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ s.new?, О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     131 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     132 *
     133 * О©╫О©╫О©╫О©╫ s.new? О©╫О©╫О©╫О©╫ Old, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     134 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ New, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     135 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.
     136 *
     137 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ s.new?, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     138 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     139 *
     140 * e.context -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     141 *
     142 * e.current -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     143 *
     144 * expr -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     145 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     146 *
     147 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e1 О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     148 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e2 (О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ e1 О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ e2), О©╫О©╫О©╫О©╫О©╫
     149 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    155150 */
    156151$func? IsSubexpr (e1) e2 = ;
     
    163158Bind_Subexprs s.Isnew (e.name) (e.context) (e.current) expr, {
    164159  /*
    165    * Прежде всего, заносим в таблицу все подвыражения.  Если какого-то из них
    166    * в таблице не оказалось, значит там нет и текущего выражения.
     160   * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫
     161   * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    167162   */
    168163  expr : e1 (PAREN e2) e3 =
     
    170165      <Bind_Subexprs Old () (e.current) (e2) e2> (e.name) (e.context) (e.current) e3>;
    171166  /*
    172    * Если все подвыражения оказались в таблице, значит там может оказаться и
    173    * весь текущий уровень.
    174    * Если его контекст уже пуст, значит он таким и остаётся.
    175    * Если он совпадает с текущим контекстом, опять всё остаётся как было.
    176    * Если же контекст раньше был иным, значит текущее подвыражение необходимо
    177    * заводить.  Его контекст обнуляется.  И мы можем не искать в таблице
    178    * следующий уровень (ведь единственный возможный оказался не совпадающим с
    179    * контекстом), поэтому возвращаем New.
     167   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     168   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     169   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫cО©╫О©╫О©╫.
     170   * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫сё О©╫О©╫О©╫cО©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
     171   * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     172   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     173   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     174   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫), О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ New.
    180175   */
    181176  s.Isnew : Old, <Lookup &St_Table e.current> : (e.tbl_name) (e.tbl_context) t.tbl_pos =
     
    192187    s.Isnew;
    193188  /*
    194    * Если известно, что текущего уровня в таблице ещё нет, надо искать в ней
    195    * его подвыражения.  Если хотя бы одно такое подвыражение нашлось, значит
    196    * текущий уровень необходимо заводить.  Это контролирует флаг s.needed?.
     189   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫
     190   * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫
     191   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ s.needed?.
    197192   *
    198    * Однако возможна ситуация, когда найденое подвыражение необходимо для
    199    * заведения текущего.  Это проверяется функцией Subexpr?.  Если она не
    200    * $fail'ится, значит подвыражение необходимо для построения текущего
    201    * уровня и, следовательно, его нельзя заводить вырезанием из него.
     193   * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     194   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ Subexpr?.  О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫
     195   * $fail'О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     196   * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫.
    202197   *
    203    * Также, текущий уровень может оказаться подвыражением какого-либо
    204    * имеющегося выражения.   Тогда это выражение должно быть заведено,
    205    * поэтому его контекст обнуляется.  Позиция текущего уровня в этом
    206    * выражении запоминается в t.pos.
    207    * Если про текущее выражение известно, чо оно новое, то такой ситуации
    208    * быть не может.
     198   * О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫
     199   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.   О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     200   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫
     201   * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ t.pos.
     202   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     203   * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
    209204   */
    210205  <Domain &St_Table> "Not-Needed" () $iter {
     
    233228
    234229/*
    235  * Выражение из &Static кладётся в таблицу с помощью функции:
     230 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static О©╫О©╫О©╫дёО©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    236231 */
    237232$func Bind_Static e = e;
     
    240235
    241236/*
    242  * Теперь перейдём ко второму этапу -- составлению списка нужных выражений в
    243  * виде форм CONSTEXPR.
    244  *
    245  * Для заведения новых имён нам понадобиться свободный индекс.
     237 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫дёО©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     238 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ CONSTEXPR.
     239 *
     240 * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫мёО©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
    246241 */
    247242$box FreeIdx;
    248243/*
    249  * Функция
     244 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    250245 */
    251246$func Name e.idx = t.name;
    252247/*
    253  * Получает индекс -- тогда она делает имя из него, либо пустое выражение --
    254  * тогда она генерирует незанятый индекс, после чего делает из него имя.
     248 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ --
     249 * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.
    255250 */
    256251Name {
     
    264259
    265260/*
    266  * Функция
     261 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    267262 */
    268263$func Subexprs_To_Constexprs expr = (e.constexprs) e.const_expr_or_its_name;
    269264/*
    270  * Возвращает список всех форм CONSTEXPR, которые нужны для заведения выражения
    271  * expr (т.е. форму, соответствующую expr, а также все, на которые она
    272  * ссылается, и которые не были заведены раньше).  Если expr необходимо
    273  * заводить как именованное выражение, то его форма включается в e.constexprs и
    274  * вторым параметром возвращается сгенерированное имя.  Иначе, второй
    275  * параметр -- это форма, соответствующая expr.
    276  *
    277  * Заведённые выражения помечаются как Constructed в таблице &St-Table.
    278  *
    279  * На случай, если пустое выражение попало в табличку, обрабатываем его
    280  * отдельно.
     265 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ CONSTEXPR, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     266 * expr (О©╫.О©╫. О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ expr, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     267 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫).  О©╫О©╫О©╫О©╫ expr О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     268 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ e.constexprs О©╫
     269 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫
     270 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ expr.
     271 *
     272 * О©╫О©╫О©╫О©╫дёО©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ Constructed О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &St-Table.
     273 *
     274 * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     275 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    281276 */
    282277Subexprs_To_Constexprs {
     
    310305
    311306/*
    312  * Выражение из &Static преобразуется в список CONSTEXPR-форм (для него, и всех
    313  * необходимых ему) с помощью функции:
     307 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ CONSTEXPR-О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫
     308 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫) О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    314309 */
    315310$func Static_To_Constexprs e.static_expr = e.constexprs;
     
    319314
    320315/*
    321  * Теперь, проинициализировав таблицу и свободный индекс, мы можем
    322  * сгенерировать список всех CONSTEXPR-форм.
     316 * О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     317 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ CONSTEXPR-О©╫О©╫О©╫О©╫.
    323318 */
    324319Comp_Consts =
     
    336331
    337332// /*
    338 //  * После того, как все нужные объекты скомпилированы, в &Static находится
    339 //  * список всех используемых в них статических выражений и констант.  Необходимо
    340 //  * для каждого выражения завести переменную (все переменные, кроме
    341 //  * экспортируемых констант должны быть статическими).
    342 //  *
    343 //  * В ASAIL эти переменные представляются так:
     333//  * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ &Static О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     334//  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     335//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫
     336//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
     337//  *
     338//  * О©╫ ASAIL О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫:
    344339//  *
    345340//  * t.const      ::= (CONSTEXPR s.linkage t.name (e.comment) e.const-expr)
     
    351346//  * s.pos, s.len ::= [int]
    352347//  *
    353 //  * e.comment содержит выражение в том виде, в котором оно встретилось в
    354 //  * Рефал-программе.  Может быть полезным для получения более читабельной
    355 //  * программы на императивном языке.
    356 //  *
    357 //  * t.path необходим для минимизации ресурсов, расходуемых на заведение
    358 //  * констант.  Эта часть ASAIL (и соответствующая часть компилятора) является
    359 //  * сугубо специфичной для векторного представления выражений с подвешенными
    360 //  * скобками.  Для спискового ран-тайма такое представление констант будет
    361 //  * вопиюще неэффективным.
    362 //  * FIXME: возможно, стоит вынести представление констант за ASAIL.  Оставить в
    363 //  * нём просто список всех употреблённых в программе константных выражений с
    364 //  * именами, и предоставить бек-энду разбираться с их представлением.
    365 //  * Тогда все нижеследующие функции, начиная с Compile-Static переедут в rfp_asail.
    366 //  *
    367 //  * t.path представляет из себя ссылку на подвыражение ранее определённого
    368 //  * выражения t.ref-name.  Эта ссылка формирует либо новое выражение целиком,
    369 //  * либо его часть, подвешенную в скобках.
    370 //  *
    371 //  * Ссылка строится по следующим правилам: сначала идёт несколько (м.б. ни
    372 //  * одного) термов вида (L s.pos) (от слов Left, Length), означающих, что надо
    373 //  * залезть в скобки, находящиеся на расстоянии s.pos от начала текущего уровня
    374 //  * (считая слева); затем идёт ровно один терм (E s.pos s.len) (от слов Expr,
    375 //  * End), означающий, что искомое подвыражение начинается в позиции s.pos
    376 //  * текущего уровня, и имеет длину s.len.
    377 //  *
    378 //  * Основная функция, обрабатывающая &Static, и выдающая список констант в
    379 //  * описанном выше виде:
     348//  * e.comment О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     349//  * О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     350//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     351//  *
     352//  * t.path О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     353//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ ASAIL (О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     354//  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     355//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     356//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     357//  * FIXME: О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ ASAIL.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     358//  * нёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     359//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     360//  * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Compile-Static О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ rfp_asail.
     361//  *
     362//  * t.path О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫О©╫О©╫О©╫О©╫
     363//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.ref-name.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     364//  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     365//  *
     366//  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫: О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫дёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫.О©╫. О©╫О©╫
     367//  * О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ (L s.pos) (О©╫О©╫ О©╫О©╫О©╫О©╫ Left, Length), О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
     368//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ s.pos О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
     369//  * (О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫); О©╫О©╫О©╫О©╫О©╫ О©╫дёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ (E s.pos s.len) (О©╫О©╫ О©╫О©╫О©╫О©╫ Expr,
     370//  * End), О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ s.pos
     371//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ s.len.
     372//  *
     373//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &Static, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     374//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫:
    380375//  */
    381376// $func Compile-Static = e.asail-const-expressions;
    382377// /*
    383 //  * Она берёт выражения из &Static и по одному добавляет их к списку уже
    384 //  * обработанных, нужным образом модифицируя этот список.
    385 //  *
    386 //  * Функция, добавляющая одно выражение к списку, называется
     378//  * О©╫О©╫О©╫ О©╫О©╫рёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     379//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
     380//  *
     381//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    387382//  * $func Add-Static-Expr (t.name e.expr) e.static-exprs = e.new-static-exprs
    388383//  */
    389384// $func Add-Static-Expr e = e;
    390385// /*
    391 //  * В списке обработанных выражений (e.static-exprs) каждое выражение "помнит" о
    392 //  * всех своих подвыражениях, которые надо завести.  К списку констант его
    393 //  * преобразует функция
     386//  * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (e.static-exprs) О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫" О©╫
     387//  * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
     388//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    394389//  */
    395390// $func Static-To-Const-Exprs e.static-exprs = e.asail-const-expressions;
    396391// /*
    397 //  * Для каждого выражения, она обрабатывает все его подвыражения непосредственно
    398 //  * за ним.  Так как одно и то же выражение может быть подвыражением нескольких
    399 //  * других выражений, необходимо помнить имена уже полученных констант, чтобы не
    400 //  * завести какую-нибудь константу несколько раз.  Для этого имена обработанных
    401 //  * выражений складываются в ящик
     392//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     393//  * О©╫О©╫ О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     394//  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     395//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     396//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫
    402397//  */
    403398// $box Const-Exprs;
     
    409404//      <WriteLN <Static-To-Const-Exprs e.static-exprs>>;
    410405// /*
    411 //  * Список e.static-exprs состоит из термов вида
    412 //  * (t.expr-name (e.subexprs) e.expr), где e.expr -- обычное выражение,
    413 //  * состоящее из символов, ссылок и скобок, в начале каждого уровня которого
    414 //  * может идти терм (S e.labels), где
     406//  * О©╫О©╫О©╫О©╫О©╫О©╫ e.static-exprs О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
     407//  * (t.expr-name (e.subexprs) e.expr), О©╫О©╫О©╫ e.expr -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     408//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     409//  * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ (S e.labels), О©╫О©╫О©╫
    415410//  * e.labels ::= [empty] | t.label
    416411//  * t.label  ::= (t.name s.pos s.len)
    417412//  *
    418 //  * e.subexprs -- список _обычных_ (без S-термов) выражений, имена которых
    419 //  * встречаются в e.labels в e.expr.
    420 //  *
    421 //  * Для того, чтобы определить, является ли данное _обычное_ выржение ey
    422 //  * подвыражением _статического_ (с S-термами) выражения ex есть функция:
     413//  * e.subexprs -- О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫О©╫О©╫О©╫О©╫_ (О©╫О©╫О©╫ S-О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     414//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ e.labels О©╫ e.expr.
     415//  *
     416//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫О©╫О©╫О©╫О©╫_ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ey
     417//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫_ (О©╫ S-О©╫О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ex О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
    423418//  */
    424419// $func? Subexpr? (ex) (ey) t.y-name = e.x-with-ey-label;
    425420// /*
    426 //  * Она ищет в ex уровень, подвыражением которого является ey, и вставляет в
    427 //  * начало этого уровня соответствующую метку.  Если ey не является
    428 //  * подвыражением ex, то функция выдаёт $fail.
     421//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ ex О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ey, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
     422//  * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫ ey О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     423//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ex, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫cО©╫ $fail.
    429424//  */
    430425// Subexpr? (ex) (ey) t.name =
     
    439434//      };
    440435// /*
    441 //  * Функция
     436//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    442437//  */
    443438// $func Find-Subexprs (ey) exprs = (e.y-with-labels) (e.subexprs) e.not-subexprs;
    444439// /*
    445 //  * берёт выражение ey (в общем случае _статическое_) и список _обычных_
    446 //  * выражений exprs.
    447 //  * Она находит в ey все подвыражения из exprs, вставляет в него соответствующие
    448 //  * e.labels, и возвращает полученное ey, список выражений из exprs, являющихся
    449 //  * подвыражениями ey, и список остальных выражений из exprs.
     440//  * О©╫О©╫рёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ey (О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫_) О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫О©╫О©╫О©╫О©╫_
     441//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ exprs.
     442//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ ey О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ exprs, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     443//  * e.labels, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ey, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ exprs, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     444//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ey, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ exprs.
    450445//  */
    451446// Find-Subexprs {
     
    459454// };
    460455// /*
    461 //  * Для того, чтобы добавить выражение из &Static к списку e.static-exprs,
    462 //  * необходимо произвести следующие действия:
    463 //  *
    464 //  * 1) Проверить, не является ли данное выражение подвыражением какого-либо из
    465 //  *    уже имеющихся в списке.  Подвыражения хранятся в списке правее, чем их
    466 //  *    хозяева, поэтому проверять надо справа на лево.
    467 //  * 2) Пусть нашлось выражение ex, содержащее наше.  Никакое из уже имеющихся
    468 //  *    его подвыражений наше не содержит.  Остаётся проверить, не содержит ли
    469 //  *    наше выражение какие-нибудь из них.  После этого подвыражениями ex
    470 //  *    являются только выражения, не являющиеся подвыражениями нашего, и само
    471 //  *    наше выражение.  Добавляем в список наше выражение сразу после ex.
    472 //  * 3) Если наше выражение не является подвыражением никакого из имеющихся, надо
    473 //  *    проверить, какие выражения являются подвыражениями нашего.  Для этого
    474 //  *    нужна их "чистая" форма (без S-термов).  Она берётся заново из &Static.
    475 //  *    Т.к. Add-Static-Expr применяется в Compile-Static посредством Foldr, и на
    476 //  *    каждое обрабатываемое выражение в e.static-exprs заводится ровно один
    477 //  *    терм, нужные нам выражения лежат в правом конце &Static, и их кол-во
    478 //  *    равняется длине имеющегося на данный момент списка.
     456//  * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ e.static-exprs,
     457//  * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
     458//  *
     459//  * 1) О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫
     460//  *    О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫
     461//  *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫.
     462//  * 2) О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ex, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     463//  *    О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫cО©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
     464//  *    О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ex
     465//  *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫
     466//  *    О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ ex.
     467//  * 3) О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫
     468//  *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.  О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
     469//  *    О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫" О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ S-О©╫О©╫О©╫О©╫О©╫О©╫).  О©╫О©╫О©╫ О©╫О©╫рёО©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ &Static.
     470//  *    О©╫.О©╫. Add-Static-Expr О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Compile-Static О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ Foldr, О©╫ О©╫О©╫
     471//  *    О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ e.static-exprs О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
     472//  *    О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ &Static, О©╫ О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫
     473//  *    О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
    479474//  */
    480475// Add-Static-Expr (t.yn ey) exprs, {
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_const.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53/*
    6  * Модуль для обработки константных выражений.
     4 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    75 */
    86
    97
    108/*
    11  * Инициализация.
     9 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    1210 */
    1311$func Init_Consts = ;
    1412
    1513/*
    16  * Сделать из константного выражения STATIC форму ASAIL.
     14 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ STATIC О©╫О©╫О©╫О©╫О©╫ ASAIL.
    1715 */
    1816$func Create_Static expr = e.static_form_or_empty;
    1917
    2018/*
    21  * Получить по STATIC-форме изначальное выражение.
     19 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ STATIC-О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    2220 */
    2321$func Get_Static t.static_form = expr;
    2422
    2523/*
    26  * Скомпилировать накопленные константные выражения и выдать получившийся
    27  * ASAIL-код.
     24 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     25 * ASAIL-О©╫О©╫О©╫.
    2826 */
    2927$func Comp_Consts = e.ASAIL_consts;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_debug.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Convert List;
    42
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_err.rf

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    18 // $Source$
    19 // $Revision$
    20 // $Date$
    21 // Author: Andrey Slepuhin <pooh@msu.ru>
     1$use Arithm Box StdIO;
    222
    23 // rfp_err.rfi
    24 $use "rfp_src" ; // rfp_src.rfi
    25 
    26 $use Box ;
    27 $use Arithm ;
    28 $use StdIO ;
     3$use "org.refal.plus.compiler.rfp_src" ; // rfp_src.rfi
    294
    305RFP_Error (s.row s.column) (e.message) =
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_err.rfi

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    18 // $Source$
    19 // $Revision$
    20 // $Date$
    21 // Author: Andrey Slepuhin <pooh@msu.ru>
     1// $Id$
    222
    233$func RFP_Error (e.pos) (e.message) = ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_format.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Access List StdIO Table;
    42
    5 $use "rfp_helper";
    6 $use "rfp_vars";
     3$use "org.refal.plus.compiler.rfp_helper";
     4$use "org.refal.plus.compiler.rfp_vars";
    75
    86$func Split_Rt t.Ft t.Rt = e.splited_Rt;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_format.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53// Gets pattern, result, or hard expression and returns its format
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_helper.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Access Arithm Box Class Compare Convert List StdIO Table;
    4 
    52
    63Lookup_Func t.Fname, \{
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_lex.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Access Apply Box Class Compare Convert List StdIO Table ;
    4 $use "rfp_src" ;
     2
     3$use "org.refal.plus.compiler.rfp_src" ;
    54
    65$box Errors Position Source ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_lex.rfi

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    181// $Id$
    192
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_parse.rf

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    18 // $Source$
    19 // $Revision$
    20 // $Date$
    21 // Author: Andrey Slepuhin <pooh@msu.ru>
    22 
    23 $use "rfp_helper" "rfp_src" "rfp_lex" ;
    241$use Access Arithm Box Convert Compare List Table StdIO ;
     2
     3$use "org.refal.plus.compiler.rfp_helper";
     4$use "org.refal.plus.compiler.rfp_src";
     5$use "org.refal.plus.compiler.rfp_lex";
    256
    267$func Token_Descr s.type = e.string ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_parse.rfi

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    18 // $Source$
    19 // $Revision$
    20 // $Date$
    21 // Author: Andrey Slepuhin <pooh@msu.ru>
     1// $Id$
    222
    233$func? RFP_Parser t.fileId = t.as ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_src.rf

    r3580 r3589  
    1 // $Id$
    2 
    31$use Apply Arithm Box Class Convert Dir File Java List StdIO Table ;
    4 $use "rfpc" "rfp_helper" ;
     2
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_helper";
    55
    66//$use "org.refal.plus.wrappers.java.io.BufferedReader";
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_src.rfi

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    181// $Id$
    192
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_vars.rf

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
    4 
    51$use Arithm Box Class Convert Dos List StdIO Table;
    62
    7 $use "rfpc";
    8 $use "rfp_asail";
    9 
    10 
     3$use "org.refal.plus.compiler.rfpc";
     4$use "org.refal.plus.compiler.rfp_asail";
    115
    126IsVar (s.tag t.name), s.tag : \{ SVAR; TVAR; VVAR; EVAR; VAR; "Len-Var"; };
    13 
    147
    158//***************************** Free indices. ******************************
     
    5043Normalize_Info e.info t.var =
    5144  /*
    52    * Если дана длина, приравнять к ней минимум и максимум.
     45   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    5346   */
    5447  {
     
    7366  } :: e.info,
    7467  /*
    75    * Если минимум не установлен, установить его, исходя из типа переменной.
     68   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
    7669   */
    7770  {
     
    8780  } :: e.info,
    8881  /*
    89    * Для s- и t-переменных установить максимум, если не установлен.
    90    * Для остальных переменных завести таблички для хранения границ.
     82   * О©╫О©╫О©╫ s- О©╫ t-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     83   * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
    9184   */
    9285  {
     
    10295  } :: e.info,
    10396  /*
    104    * Если минимум совпадает с максимумом, то установить длину.
    105    * FIXME: не нужно ли здесь упрощать выражения для минимума и максимума?
     97   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
     98   * FIXME: О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?
    10699   */
    107100  {
     
    111104  } :: e.info,
    112105  /*
    113    * Если переменная получила значение, а длина её не была известна, значит
    114    * она будет считаться функцией LENGTH в ран-тайм.
     106   * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ её О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫
     107   * О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ LENGTH О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫.
    115108   */
    116109  {
     
    264257
    265258/*
    266  * (s.tag s.box) -- сгенерированная ранее переменная.
    267  * Вместо того, чтобы присвоить её значение переменной t.var, мы подставляем
    268  * t.var во все места, гда была использована (s.tag s.box).  Таким образом,
    269  * t.var получит нужное значение в тот момент, когда выполняется присваивание в
     259 * (s.tag s.box) -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
     260 * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.var, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     261 * t.var О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (s.tag s.box).  О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
     262 * t.var О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫
    270263 * (s.tag s.box).
    271  * Если переменная t.var уже была ранее декларирована, чтобы избежать повторной
    272  * декларации, делаем декларацию для (s.tag s.box) пустой.
    273  * Если же переменная t.var -- новая, то её декларацией становится декларация
     264 * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.var О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
     265 * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ (s.tag s.box) О©╫О©╫О©╫О©╫О©╫О©╫.
     266 * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ t.var -- О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
    274267 * (s.tag s.box).
    275268 */
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_vars.rfi

    r3580 r3589  
    1 // $Source$
    2 // $Revision$
    3 // $Date$
     1// $Id$
    42
    53$func? IsVar expr = ;
  • to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfpc.rf

    r3580 r3589  
    1 //
    2 // Copyright (C) 1999, 2000 Refal+ Development Group
    3 //
    4 // Refal+ is free software; you can redistribute it and/or modify
    5 // it under the terms of the GNU General Public License as published by
    6 // the Free Software Foundation; either version 2 of the License, or
    7 // (at your option) any later version.
    8 //
    9 // Refal+ is distributed in the hope that it will be useful,
    10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 // GNU General Public License for more details.
    13 //
    14 // You should have received a copy of the GNU General Public License
    15 // along with Refal+; if not, write to the Free Software
    16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17 //
    18 // $Id$
    19 
    20 $use "rfp_src"; // rfp_src.rfi
    21 $use "rfp_err"; // rfp_err.rfi
    22 $use "rfp_lex"; // rfp_lex.rfi
    23 $use "rfp_parse"; // rfp_parse.rfi
    24 $use "rfp_compile"; // rfp_compile.rfi
    25 $use "rfp_asail_cpp"; //rfp_asail_cpp.rfi
    26 $use "rfp_asail_java"; //rfp_asail_java.rfi
    27 $use "rfp_asail_tpp"; //rfp_asail_tpp.rfi
    28 $use "rfp_asail_jbc";
    29 $use "rfp_as2as";
    30 $use "rfp_check";
    31 $use "rfp_helper";
    32 $use "rfp_format";
    33 $use "rfp_asail2asail";
    34 
    35 $use Access Arithm Box Class Compare Convert CppMangle File Java JavaMangle
    36    Dos List Table StdIO;
     1$use Access Arithm Box Class Compare Convert CppMangle Dos File Java JavaMangle List Table StdIO;
     2
     3$use "org.refal.plus.compiler.rfp_src"; // rfp_src.rfi
     4$use "org.refal.plus.compiler.rfp_err"; // rfp_err.rfi
     5$use "org.refal.plus.compiler.rfp_lex"; // rfp_lex.rfi
     6$use "org.refal.plus.compiler.rfp_parse"; // rfp_parse.rfi
     7$use "org.refal.plus.compiler.rfp_compile"; // rfp_compile.rfi
     8$use "org.refal.plus.compiler.rfp_asail_cpp"; //rfp_asail_cpp.rfi
     9$use "org.refal.plus.compiler.rfp_asail_java"; //rfp_asail_java.rfi
     10$use "org.refal.plus.compiler.rfp_asail_tpp"; //rfp_asail_tpp.rfi
     11$use "org.refal.plus.compiler.rfp_asail_jbc";
     12$use "org.refal.plus.compiler.rfp_as2as";
     13$use "org.refal.plus.compiler.rfp_check";
     14$use "org.refal.plus.compiler.rfp_helper";
     15$use "org.refal.plus.compiler.rfp_format";
     16$use "org.refal.plus.compiler.rfp_asail2asail";
    3717
    3818$func FileOutputStream s = s;
Note: See TracChangeset for help on using the changeset viewer.