58 lines
1.3 KiB
Plaintext
58 lines
1.3 KiB
Plaintext
$ENTRY Go {
|
|
, <Arg 1>: e.File
|
|
, <Arg 2>: e.Input
|
|
, <ReadLines 1 e.File>: e.Lines
|
|
, <Each ParseRule e.Lines>: e.Rules
|
|
, <Apply (e.Rules) e.Input>: e.Result
|
|
= <Prout e.Result>;
|
|
};
|
|
|
|
Each {
|
|
s.F = ;
|
|
s.F (e.I) e.R = <Mu s.F e.I> <Each s.F e.R>;
|
|
};
|
|
|
|
ReadLines {
|
|
s.Chan e.File = <Open 'r' s.Chan e.File>
|
|
<ReadLines (s.Chan)>;
|
|
(s.Chan), <Get s.Chan>: {
|
|
0 = <Close s.Chan>;
|
|
e.Line = (e.Line) <ReadLines (s.Chan)>;
|
|
};
|
|
};
|
|
|
|
ParseRule {
|
|
= (Empty);
|
|
'#' e.X = (Empty);
|
|
e.Pat ' -> ' e.Rep,
|
|
<Trim e.Pat>: e.TrPat,
|
|
<Trim e.Rep>: 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,
|
|
<ApplyRule t.Rule e.Subj>: {
|
|
NoMatch e.Subj = <Apply (e.Rules) (e.Rest) e.Subj>;
|
|
Term e.Res = e.Res;
|
|
Nonterm e.Res = <Apply (e.Rules) e.Res>;
|
|
};
|
|
(e.Rules) e.Subj = <Apply (e.Rules) (e.Rules) e.Subj>;
|
|
};
|
|
|
|
Trim {
|
|
' ' e.X = <Trim e.X>;
|
|
e.X ' ' = <Trim e.X>;
|
|
e.X = e.X;
|
|
};
|