!7 sclass Parser { new StringTree2 tree; L tok(S s) { ret javaTok(s); } L tokC(S s) { ret javaTokC(s); } void register(S text, O action) { addToStringTree(tree, tokC(text), action); } Parsing parse(S text) { ret nu(Parsing, parser := this, it := tokC(text).iterator(), treesInFlight := ll(new InFlight(tree))); } } sclass InFlight { new L history; StringTree2 tree; *() {} *(StringTree2 *tree) {} *(L *history, StringTree2 *tree) {} } sclass Parsing { Parser parser; Iterator it; new L treesInFlight; void run { while (it.hasNext()) step(); } void step { S token = it.next(); for i over treesInFlight: { InFlight tree = treesInFlight.get(i); StringTree2 tree2 = tree.tree.get(token); if (tree2 == null) treesInFlight.remove(i--); else treesInFlight.set(i, new InFlight(tree.history, tree2)); } actions(); } void actions { for (StringTree2 tree : treesInFlight) if (tree! != null) runAction(tree!); } void runAction(O o) { print("Action! " + struct(o)); } } p { new Parser p; p.register("I am here", "I-am-here"); Parsing pp = p.parse("yo I am here"); pp.run(); }