4-2-5
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) = eX;
tE (eX) = <Eval tE eX>;
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 sF (eX) = <Apply sF <Eval tE eX>>;
}
Subst {
() sN = <NUMB sN>;
(eT (sV eX)) sV = eX;
(eT (sV eX)) sN = <Subst (eT) sN>;
}
Apply {
Fact eN = <Fact eN>;
}
|