4-2-3

Однократное присваивание

Fact  {
    0  = 1;
    sN = <Int N':='sN';'
              N'*'Fact(N'-'1)
         >;
}

Int { eX = <Eval () eX>; }

Eval {
   (eT) sV ':='tX';'eY   = <Eval (eT (sV <Eval (eT) tX>)) eY>;
    tE  sN               = <Subst tE sN>;
    tE  eX '+' eY        = <ADD (<Eval tE eX>) <Eval tE eY>>;
    tE  eX '-' eY '-' eZ = <Eval tE (eX '-' eY) '-' eZ>;
    tE  eX '-' eY        = <SUB (<Eval tE eX>) <Eval tE eY>>;
    tE  eX '*' eY        = <MUL (<Eval tE eX>) <Eval tE eY>>;
    tE  (eX)             = <Eval tE eX>;
    tE  sF (eX)          = <Apply sF <Eval tE eX>>;
}

Subst {
    ()           sN = sN;
    (eT (sV eX)) sV = eX;
    (eT (sV eX)) sN = <Subst (eT) sN>;
}

Apply {
    Fact eN = <Fact eN>;
}