Changeset 721


Ignore:
Timestamp:
May 5, 2003, 2:32:05 PM (17 years ago)
Author:
orlov
Message:
  • Corrected bug in the static expression generation algorithm.
Location:
to-imperative/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/compiler/rfp_const.rf

    r712 r721  
    147147 * expr -- остаток текущего уровня, который надо просмотреть на предмет
    148148 * подвыражений.
    149  */
     149 *
     150 * Для проверки того, что выражение e1 является подвыражением в скобках для
     151 * выражения e2 (откуда следует, что e1 не может быть заведено после e2), далее
     152 * используется функция
     153 */
     154$func? Subexpr? (e1) e2 = ;
     155
     156Subexpr? (e1) e2, \{
     157  e1 : e2;
     158  e2 : e3 (PAREN e4) e5, <Subexpr? (e1) e4>;
     159};
    150160
    151161Bind-Subexprs s.new? (e.name) (e.context) (e.current) expr, {
     
    183193   * его подвыражения.  Если хотя бы одно такое подвыражение нашлось, значит
    184194   * текущий уровень необходимо заводить.  Это контролирует флаг s.needed?.
     195   *
     196   * Однако возможна ситуация, когда найденое подвыражение необходимо для
     197   * заведения текущего.  Это проверяется функцией Subexpr?.  Если она не
     198   * $fail'ится, значит подвыражение необходимо для построения текущего
     199   * уровня и, следовательно, его нельзя заводить вырезанием из него.
    185200   *
    186201   * Также, текущий уровень может оказаться подвыражением какого-либо
     
    193208  <Domain &St-Table> Not-Needed () $iter {
    194209    e.domain : (e.key) e.rest, {
    195       <Lookup &St-Table e.key> : e.tbl-params (), e.current : e1 e.key e2 =
     210      <Lookup &St-Table e.key> : e.tbl-params (),
     211        e.current : e1 e.key e2,
     212        # <Subexpr? (e.key) e.current> =
    196213        <Bind &St-Table (e.key)
    197214          (e.tbl-params (<Length e1> <Length e.key> e.current))>,
     
    257274 *
    258275 * Заведённые выражения помечаются как Constructed в таблице &St-Table.
    259  */
    260 Subexprs-To-Constexprs expr =
    261   <Lookup &St-Table expr> : {
     276 *
     277 * На случай, если пустое выражение попало в табличку, обрабатываем его
     278 * отдельно.
     279 */
     280Subexprs-To-Constexprs {
     281  /*empty*/ = () /*empty*/;
     282  expr, <Lookup &St-Table expr> : {
    262283    Constructed e.const = () e.const;
    263284    (e.name) (e.context) (e.pos) =
     
    284305      (e.constexprs) e.const;
    285306  };
     307};
    286308
    287309/*
  • to-imperative/trunk/samples/Syntax/static1.cc

    r715 r721  
    99{
    1010
    11 static const Expr _c_16 = Word::create_expr ("X") + Word::create_expr ("A") + Word::create_expr ("B") + Word::create_expr ("C") + Word::create_expr ("D");
     11static const Expr _c_17 = Word::create_expr ("X") + Word::create_expr ("A") + Word::create_expr ("B") + Word::create_expr ("C") + Word::create_expr ("D");
    1212
    13 static const Expr _c_17 = Expr (_c_16, 2, 2);
     13static const Expr _c_18 = Expr (_c_17, 2, 2);
    1414
    15 static const Expr _c_0 = Word::create_expr ("A") + (_c_17) () + Word::create_expr ("D");
     15static const Expr _c_0 = Word::create_expr ("A") + (_c_18) () + Word::create_expr ("D");
    1616
    17 static const Expr _c_18 = Expr (_c_16, 3, 2);
     17static const Expr _c_19 = Expr (_c_17, 3, 2);
    1818
    19 static const Expr _c_5 = Word::create_expr ("A") + Word::create_expr ("B") + (_c_18) () + Word::create_expr ("E") + Word::create_expr ("F");
     19static const Expr _c_5 = Word::create_expr ("A") + Word::create_expr ("B") + (_c_19) () + Word::create_expr ("E") + Word::create_expr ("F");
    2020
    2121static const Expr _c_1 = Expr (_c_5, 0, 2);
    2222
    23 static const Expr _c_19 = Expr (_c_16, 0, 3);
     23static const Expr _c_20 = Expr (_c_17, 0, 3);
    2424
    25 static const Expr _c_8 = (_c_1) () + (_c_19) () + (_c_16) () + (_c_17) () + (_c_18) ();
     25static const Expr _c_8 = (_c_1) () + (_c_20) () + (_c_17) () + (_c_18) () + (_c_19) ();
    2626
    2727static const Expr _c_2 = Expr (_c_8, 0, 1);
     
    2929static const Expr _c_3 = (_c_2) ();
    3030
    31 static const Expr _c_4 = Word::create_expr ("D") + (_c_17) () + Word::create_expr ("A");
     31static const Expr _c_4 = Word::create_expr ("D") + (_c_18) () + Word::create_expr ("A");
    3232
    33 static const Expr _c_7 = Word::create_expr ("A") + Word::create_expr ("X") + (_c_18) () + Word::create_expr ("Y") + Word::create_expr ("B") + (Word::create_expr ("Z") + Word::create_expr ("Z")) ();
     33static const Expr _c_7 = Word::create_expr ("A") + Word::create_expr ("X") + (_c_19) () + Word::create_expr ("Y") + Word::create_expr ("B") + (Word::create_expr ("Z") + Word::create_expr ("Z")) ();
    3434
    3535static const Expr _c_6 = Word::create_expr ("M") + (Expr (_c_7, 1, 3)) () + Word::create_expr ("N");
     
    3737static const Expr _c_9 = Expr (_c_8, 1, 2);
    3838
    39 static const Expr _c_13 = ShortInt::create_expr (1) + ShortInt::create_expr (2) + ShortInt::create_expr (3) + ShortInt::create_expr (4);
     39static const Expr _c_21 = (empty) ();
    4040
    41 static const Expr _c_10 = Expr (_c_13, 0, 2);
     41static const Expr _c_10 = ((_c_21) ()) () + (_c_21) () + (empty) ();
    4242
    43 static const Expr _c_11 = Expr (_c_13, 2, 2);
     43static const Expr _c_14 = ShortInt::create_expr (1) + ShortInt::create_expr (2) + ShortInt::create_expr (3) + ShortInt::create_expr (4);
    4444
    45 static const Expr _c_12 = Expr (_c_13, 1, 2);
     45static const Expr _c_11 = Expr (_c_14, 0, 2);
    4646
    47 static const Expr _c_14 = Expr (_c_13, 0, 3);
     47static const Expr _c_12 = Expr (_c_14, 2, 2);
    4848
    49 static const Expr _c_15 = Expr (_c_13, 1, 3);
     49static const Expr _c_13 = Expr (_c_14, 1, 2);
     50
     51static const Expr _c_15 = Expr (_c_14, 0, 3);
     52
     53static const Expr _c_16 = Expr (_c_14, 1, 3);
    5054
    5155RF_FUNC (Main, (), (RF_RES _v_res1))
     
    6064  Expr _ve__e__e_tmp_m_static1rf_m_11_m_45 (_c_8);
    6165  Expr _ve__e__e_tmp_m_static1rf_m_12_m_27 (_c_9);
    62   Expr _ve__e__e_tmp_m_static1rf_m_13_m_11 (_c_10);
     66  Expr _ve__e__e_tmp_m_static1rf_m_13_m_22 (_c_10);
    6367  Expr _ve__e__e_tmp_m_static1rf_m_14_m_11 (_c_11);
    6468  Expr _ve__e__e_tmp_m_static1rf_m_15_m_11 (_c_12);
    65   Expr _ve__e__e_tmp_m_static1rf_m_16_m_15 (_c_13);
    66   Expr _ve__e__e_tmp_m_static1rf_m_17_m_13 (_c_14);
     69  Expr _ve__e__e_tmp_m_static1rf_m_16_m_11 (_c_13);
     70  Expr _ve__e__e_tmp_m_static1rf_m_17_m_15 (_c_14);
    6771  Expr _ve__e__e_tmp_m_static1rf_m_18_m_13 (_c_15);
     72  Expr _ve__e__e_tmp_m_static1rf_m_19_m_13 (_c_16);
    6873  _v_res1 = empty;
    6974RF_END
  • to-imperative/trunk/samples/Syntax/static1.rf

    r682 r721  
    1111  (A B) (X A B) (X A B C D) (B C) (C D) :: e,
    1212  (X A B) (X A B C D) :: e,
     13  ((())) (()) () :: e,
    1314  1 2 :: e,
    1415  3 4 :: e,
Note: See TracChangeset for help on using the changeset viewer.