srecord RuleWithParams(IfThen rule, SS matches) {} srecord IfThen(Exp in, Exp out) { S globalID; Set options; S text() { ret in.text() + " => " + out.text(); } toString { ret text(); } } abstract sclass Exp { abstract S text(); toString { ret text(); } } srecord Func(S name, Exp arg) extends Exp { S text() { ret name + "(" + arg.text() + ")"; } } srecord And(Exp a, Exp b) extends Exp { S text() { ret a.text() + " && " + b.text(); } } srecord ExpNot(Exp a) extends Exp { S text() { ret "!" + a.text(); } } abstract sclass Literal extends Exp {} srecord Sentence(L tok) extends Literal { S text() { ret join(tok); } } srecord Sentence2(S text) extends Literal { S text() { ret text; } } srecord Eq(Exp left, Exp right) extends Exp { S text() { ret left.text() + " = " + right.text(); } }