err I think commit() would have to set the current state to the new one. commit(state){ current = state; }
or something.. On 12/13/2011 02:34 PM, Jon Rafkind wrote: > I am planning on supporting global state in my peg generator. The way Rats! > does it with transactions looks pretty good to me but my question is how to > actually implement the state operations in a manner that work with > transactions. Specifically the state has to be pure in some sense so that it > can be "undone" by an abort operation. > > My first naive idea is to have some State class (maybe defined by the user) > with a pointer to a child State class. The start() method of a transaction > would create a new State object and set parent->next to it. Then the user can > modify the new State object. commit() would be a no-op and abort() would > reset the parent->next pointer to null. > > In psuedo-code > > start(){ > state = new State(); > current->next = state; > return state; > } > > abort(){ > current->next = null; > } > > commit(){} > > # blah = a b c > # | d e f > rule_blah(){ > # For each production, do a start/commit/abort sequence > state = start(); > rule_a(); rule_b(); rule_c(); > commit(); > return > fail: # if any of the rules failed somehow > abort(); > > state = start(); > rule_d(); rule_e(); rule_f(); > commit(); > return > fail: > abort(); > } > > _______________________________________________ > PEG mailing list > PEG@lists.csail.mit.edu > https://lists.csail.mit.edu/mailman/listinfo/peg _______________________________________________ PEG mailing list PEG@lists.csail.mit.edu https://lists.csail.mit.edu/mailman/listinfo/peg