* vim: et:sw=4:ts=4 IntCall { (e.program) ((FUNC s.fname e.sentences) e.func_defs) s.name e.args, s.fname : { s.name = ; s.other = ; }; } IntFunc { (e.program) ((SENTENCE s.name (e.patterns) e.exp) e.sentences) e.args, : { e.1 Fail = ; e.subst = ; }; } MkSubst { ((e.pat) e.patterns) (e.arg) e.args, : { e.1 Fail = Fail; e.subst = e.subst ; }; () /*empty*/ = /*empty*/ } MkSubst1 { ((VAR s.tag s.name)) (s.tag e.data) = ((VAR s.tag s.name) (s.tag e.data)); (e.pattern) (s.tag e.data) = ; } MkSubst2 { ((VAR s.tag s.name) e.pattern) (s.tag e.data) e.arg = ((VAR s.tag s.name) (s.tag e.data)) ; (s.1 e.pattern) s.1 e.arg = ; () /*empty*/ = ; (e.pattern) e.arg = Fail; }; IntExp { (e.program) (e.subst) (UNDEFINED), : () = ; (e.program) (e.subst) (EXP s.tag e.data) = (s.tag ); (e.program) (e.subst) s.sym = s.sym; (e.program) (e.subst) (VAR s.tag s.name) = ; (e.program) (e.subst) (CALL s.name e.args) = >; (e.program) (e.subst) (PAREN e.exp) = ; (e.program) (e.subst) (IF (e.cond) (e.true) (e.false)), : { (Bool 'True') = ; (Bool 'False') = ; }; (e.program) (e.subst) (LET (e.assigns) e.exp) = ; } IntExp2 { (e.program) (e.subst) t.term e.exp = ; (e.program) (e.subst) /*empty*/ = /*empty*/; } IntArgs { (e.program) (e.subst) (e.exp) e.args = () ; (e.program) (e.subst) /*empty*/ = /*empty*/; } IntLet { (e.program) (e.subst) (((VAR s.tag s.name) e.exp1) e.assigns) e.exp = )) (e.assigns) e.exp>; (e.program) (e.subst) () e.exp = ; } Subst { (((VAR s.tag s.name) t.value) e.subst) (VAR s.tag s.name) = t.value; (t.1 e.subst) (VAR s.tag s.name) = ; } $ENTRY Go { = >; }