$ENTRY Go { , : e.File , : e.Input , : e.Lines , : e.Rules , : e.Result = ; }; Each { s.F = ; s.F (e.I) e.R = ; }; ReadLines { s.Chan e.File = ; (s.Chan), : { 0 = ; e.Line = (e.Line) ; }; }; ParseRule { = (Empty); '#' e.X = (Empty); e.Pat ' -> ' e.Rep, : e.TrPat, : e.TrRep, e.TrRep: { '.' e.R = (Term (e.Pat) (e.R)); e.R = (Nonterm (e.Pat) (e.R)); }; }; ApplyRule { (s.Type (e.Pat) (e.Rep)) e.Subj, e.Subj: e.X e.Pat e.Y = s.Type e.X e.Rep e.Y; t.Rule e.Subj = NoMatch e.Subj; }; Apply { (e.Rules) () e.Subj = e.Subj; (e.Rules) (t.Rule e.Rest) e.Subj, : { NoMatch e.Subj = ; Term e.Res = e.Res; Nonterm e.Res = ; }; (e.Rules) e.Subj = ; }; Trim { ' ' e.X = ; e.X ' ' = ; e.X = e.X; };