!7 cmodule TopDownParsing > DynSCP { S input = "Bob paid for Charlie 's college education"; TryPatterns root; // Tree has 2 types of nodes: composite and options class Base { new L children; L children() { ret children; } } class AppliedPattern > Base { S pattern; LS arguments; toString { ret stdToStringWithFields(this, 'pattern, 'arguments); } } class TryPatterns > Base { S input; *() {} *(S *input) { for (S pat : patterns()) for (LS arguments : matchesToStringLists(flexMatchIC_all(pat, input))) children.add(setAll(new AppliedPattern, pattern := pat, +arguments)); } toString { ret stdToStringWithFields(this, 'input); } } start-thread { setField(root := parse(input)); setComponent(jDynamicTree(root, x -> x.children())); } LS patterns() { ret dm_getUnclearList("patterns"); } TryPatterns parse(S s) { ret new TryPatterns(s); } }