!7 srecord Superposition(Cl options) { *(O... options) { this.options = asList(options); } } sclass Executable { void step(ProbabilisticMachine2 pm, ImmutableListWalker inputWalker) {} } srecord Sequence(L steps) > Executable { O continuation; *(O... steps) { this.steps = asList(steps); } void step(ProbabilisticMachine2 pm, ImmutableListWalker inputWalker) } asclass GrammarClass {} sclass Statement > GrammarClass {} srecord grab(what) > Executable { void step(ProbabilisticMachine2 pm, ImmutableListWalker inputWalker) { } } // what: string or a GrammarClass cprint { start-thread { Superposition main = Superposition( Sequence( grab("I"), grab("think"), Superposition( Sequence( grab("that"), grab(Statement) ), grab(Statement) ) ), Sequence( grab("Do"), grab("you"), grab("think"), grab("that"), grab(Statement), grab("?") ), grab(Statement) ); printIndentedStruct(main); S input = "I think that you're right"; new ProbabilisticMachine2 pm; ImmutableListWalker inputWalker = new(javaTokC(input)); process(pm, inputWalker, main); } void process(ProbabilisticMachine2 pm, ImmutableListWalker inputWalker, O code) { if (code cast Superposition) { fOr (O option : code.options) pm.addState(new ProbabilisticMachine2.State { void step { process(pm, inputWalker, option); } }); } else if (code cast Executable) { pm.addState(new ProbabilisticMachine2.State { void step { code.step(pm, inputWalker, code); } }); } else fail("Unknown code type: " + code); } }